gpt4 book ai didi

ios - 在 iPad 上的弹出窗口中推送导航 View Controller 时动画 popoverContentsize

转载 作者:技术小花猫 更新时间:2023-10-29 10:10:00 25 4
gpt4 key购买 nike

当 UIPopoverController 包含的 UINavigationController 推送一个新 Controller 时,如何让我的 UIPopoverController 为其大小设置动画?
我有一个 UIPopoverUIBarButtonItem 显示在我的 iPad 应用程序中。它包含一个 UINavigationViewController ,它有一种设置窗口作为它的 Root View Controller 。设置窗口是 UITableViewController 的子类。 (样式设置为分组),并点击它的任何单元格将不同的“选择器” View Controller 推送到导航 Controller 上,这些 Controller 也是 UITableViewController 的子类.
对于每个选择器 View ,在 viewDidAppear , 我正在设置 contentSizeForViewInPopover适本地:

self.contentSizeForViewInPopover = CGSizeMake(320, self.items.count * 44);
但它并没有动画变化;当导航动画结束时,弹出框会捕捉到新的高度(宽度永远不会从 320 改变)。向后导航会动画大小变化(使用 this answer 中的技术完成),但向前导航不会。
我尝试获取对它所在的弹出框的引用并使用 setPopoverContentSize:animated:但它不起作用。我看过 other questions无济于事。
如何让它始终正确地为大小变化设置动画?
更新:我已经建立了一个简单的测试项目来试试这个。这是在 Xcode 中设置的 iPad 的标签栏应用程序。我在其中一个 View Controller 的导航栏中添加了一个标签栏项目。按下该按钮时, Controller 会显示一个弹出框,其中包含一个导航 Controller ,该 Controller 具有非常简单的 UITableViewController子类,称为 TestContentViewController ,作为它的 Root View Controller 。
viewDidLoad在那个子类中,我随机生成了一些项目:
self.numItems = arc4random() % 10 + 3;
这是我的行数;节数为 1。在 cellForRowAtIndexPath我只是设置单元格的标签文本并返回它。选择一行时,我会生成同一类的另一个实例,然后将其推在堆栈上。
无需对 contentSizeForViewInPopover 进行任何操作任何 VC 上的属性,无论我的 TableView 中有多少行,弹出框都会达到其最大高度并保持在那里。
如果我在 viewDidAppear 中设置大小,如下所示:
-(void)viewDidAppear:(BOOL)animated
{
self.contentSizeForViewInPopover = CGSizeMake(320, self.numItems * 44);
[super viewDidAppear:animated];
{
  • 当弹出框第一次出现时,它会非常快速地闪烁到全高,然后捕捉到我设置的高度。
  • 当一个新的 Controller 被推到导航 Controller 上时,它会在没有动画的情况下捕捉到它的高度。
  • 当我向后导航时,如果我弹出的 VC 比我弹出的那个高,它会动画到正确的大小。如果我弹出的内容更小,它什么也不做。

  • 如果我做同样的事情,但在 viewWillAppear :
  • 当弹出框第一次出现时,它是全高
  • 当我第一次点击一行并在堆栈中获得一个新 Controller 时,它的动画高度至少约为 400 像素。当一个新的 Controller 被压入堆栈时,如果它需要更多的高度,它就会得到它。如果不是,它会保持以前的状态。

  • 如果我在 viewDidLoad 中做同样的事情,与 viewWillAppear基本相同除了它最初以正确的大小出现。
    我尝试将导航 Controller 的委托(delegate)设置为呈现弹出框的 VC,然后在 setPopoverContentSize:animated: 中设置弹出框的高度( navigationController:didShowViewController:animated:) ,但最终的高度有一点偏差。我认为我在那里设置的大小需要考虑到内置于弹出框顶部的导航栏的额外高度。将新 Controller 插入堆栈时的动画很奇怪。
    再次更新:见 here用较新的 UIPopoverPresentationController 解决了同样的问题.

    最佳答案

    尝试为所有 执行以下操作UITableViewController ,我试过了,它对我有用!

    - (void)setSize:(BOOL)fake
    {
    CGSize view_size;
    int sections_height, rows_height;

    //if you dynamically change the number of visible rows
    //for example overriding numberOfRowsInSection:section
    //this can help you to evaluate the correct popover height
    int sections = [self.tableView numberOfSections];
    int rows = 0;
    for(int i = 0; i < sections; i++){
    rows += [self.tableView numberOfRowsInSection:i];
    }
    sections_height = sections * 30 /*section height*/;
    rows_height = rows * 44 /*row height*/;

    view_size = CGSizeMake(320 /*fixed width*/, sections_height + rows_height);

    if(fake){
    view_size.width -= 1;
    view_size.height -= 1;
    }

    [self setContentSizeForViewInPopover:view_size];
    }

    - (void)viewDidLoad
    {
    [super viewDidLoad];
    //...
    [self setSize:FALSE];
    }

    - (void)viewWillAppear:(BOOL)animated
    {
    [super viewWillAppear:animated];
    [self setSize:TRUE];
    }

    - (void)viewDidAppear:(BOOL)animated
    {
    [self setSize:FALSE];
    [super viewDidAppear:animated];
    }

    关于ios - 在 iPad 上的弹出窗口中推送导航 View Controller 时动画 popoverContentsize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12605818/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com