当 titleView 设置为 mid push 动画时 UINaviationsItem titleView 的框架设置不正确的问题

Posted

技术标签:

【中文标题】当 titleView 设置为 mid push 动画时 UINaviationsItem titleView 的框架设置不正确的问题【英文标题】:Issue where the UINaviationsItem titleView's frame is set incorrectly when the titleView is set mid push animation 【发布时间】:2014-02-05 18:02:52 【问题描述】:

我有一个方法可以创建一个titleView。

- (void) makeTitleView 
    UIImage * image = [UIImage imageNamed:@"myImage"];
    UIImageView * imageView = [[UIImageView alloc] initWithImage:image];

    self.navigationItem.titleView = imageView;

viewDidLoad 中调用时可以正常工作:

- (void)viewDidLoad

    [self makeTitleView];

但是,如果在一小段延迟(小于pushViewController:animated: 动画时间)之后调用:

- (void)viewDidLoad
   
    double delayInSeconds = 0.1;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
        [self makeTitleView];
    );

那么标题视图就给错了框架:

在动画结束时,帧会自行排序。

在 0.1 秒后设置标题似乎是人为的,但这种情况发生在我的一个应用程序上。 titleView 需要在网络请求之后设置,当结果来自缓存时,该网络请求在下一个运行循环之后返回。

我可以避免这个问题,但只是延迟更长的时间或调用viewDidAppear:中的方法,但两种解决方案都会引入不必要的延迟。有没有其他方法可以解决这个问题?

【问题讨论】:

【参考方案1】:

您可以制作一个占位符标题视图,并在网络请求完成后完成填充。

您当前的设置似乎有点脆弱 - 通常在您需要执行 dispatch_after 的任何时候,它要么解决一些 UIKit 错误,要么您需要重组您的方法。

【讨论】:

以上是关于当 titleView 设置为 mid push 动画时 UINaviationsItem titleView 的框架设置不正确的问题的主要内容,如果未能解决你的问题,请参考以下文章

当 prefersLargeTitles 为 true 时自定义 NavigatioItem TitleView

iOS系统导航栏自定义标题动画跳变解析

iOS系统导航栏自定义标题动画跳变解析

为 UINavigationItem 的 titleView 设置视图控制器

如何将 UISearchController 搜索栏设置为不是 tableHeaderView 或 navigationItem.titleview 的视图?

iOS 11 navigationItem.titleView 宽度未设置