草庐IT

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

coder 2023-07-26 原文

当 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/

    有关ios - 在 iPad 上的弹出窗口中推送导航 View Controller 时动画 popoverContentsize的更多相关文章

    1. ruby - 多次弹出/移动 ruby​​ 数组 - 2

      我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

    2. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

      我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

    3. ruby-on-rails - openshift 上的 rails 控制台 - 2

      我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

    4. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

      我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

    5. ruby - 如何验证 IO.copy_stream 是否成功 - 2

      这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

    6. Ruby 文件 IO 定界符? - 2

      我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

    7. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

      Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

    8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

      1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

    9. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

      我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

    10. ruby - 为什么不能使用类IO的实例方法noecho? - 2

      print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

    随机推荐