UINavigationController:调整大小动画中的标题跳转

Posted

技术标签:

【中文标题】UINavigationController:调整大小动画中的标题跳转【英文标题】:UINavigationController: Title Jumps in Resize Animation 【发布时间】:2011-01-21 11:09:57 【问题描述】:

我有一个 ipad 应用程序,我想在其中隐藏和显示一个类别列表(有点像拆分视图控制器中的小视图),以及包含 UiNavigationController 堆栈的主视图。

我想在隐藏类别列表时调整 UINavigationController 视图的大小以填满整个屏幕,并在我显示列表时缩小。

我有它的工作,除了导航栏的标题在动画开始/提交块中设置帧时立即跳转到新的偏移量。

任何想法如何停止标题的跳跃?

【问题讨论】:

【参考方案1】:

我用它来修复 UINavigationBar 中标题和右键的跳转。

#import "UINavigationBar+My.h"

@implementation UINavigationBar (My)

- (void)layoutSubviews 
for (id obj in [self subviews]) 
    if ([NSStringFromClass([obj class]) isEqualToString:@"UINavigationItemView"])
        [(UIView *)obj setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin];
    else if ([NSStringFromClass([obj class]) isEqualToString:@"UIButton"]) 
        if ([(UIButton *)obj center].x < ([self center].x / 2))
            [(UIButton *)obj setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
        else
            [(UIButton *)obj setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
    


@end

希望对你有帮助;-)

【讨论】:

您好,感谢您的回答 +1。你肯定给我指出了正确的方向,但我不能接受你的回答,因为它太可怕了!没有类检查......只有当你只有一个标题和 RHS 按钮时才有效(即不会处理后退按钮)。如果苹果改变视图顺序,那么它将打破..等等。请提交一个更强大的解决方案以使答案被接受(或者我会用我自己的解决方案来回答)!干杯:) 哈哈,那真是太可怕了! :) 这只是我项目中的一个快速修复。这是否更好?您的解决方案基于什么? 是的,这样更好,接受!也会发布我自己的……我认为你的无法处理后退按钮和其他一些可能的场景。【参考方案2】:

我最近遇到了类似的问题;我有一个动画视图的子视图,它立即跳到新位置。发生这种情况是因为我在动画完成之前以编程方式修改了该视图,因此在该视图上调用了 -layoutSubviews。您是否正在做一些事情,例如更改标题的文本或以某种方式对其进行修改以导致调用 -layoutSubviews

【讨论】:

我遇到过这样的情况,在viewWillAppear 中有一段名为layoutIfNeeded 的代码。移除layoutIfNeeded 移除了奇怪的动画。【参考方案3】:

我的解决方案似乎可以应对我在应用中遇到的所有情况。显然还是有点 hack,所以不能保证它会一直有效!

@implementation UINavigationBar (Nick)

- (void)layoutSubviews 
    [super layoutSubviews];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
        UIView* titleView = nil;
        CGFloat buttonWidths = 0;
        for (UIView* subview in [self subviews]) 

            if ([subview class] == NSClassFromString(@"UINavigationItemView")) 
                if (titleView) 
                    // Exit here - if there is more than one title, probably doing a pop
                    return;
                
                titleView = subview;
            
            else if ([subview class] == [UIView class] ||                           // bar button with custom view
                     [subview class] == NSClassFromString(@"UINavigationButton"))  // or ordinary bar button

                buttonWidths += subview.frame.size.width;
                // is it RHS?
                if (subview.frame.origin.x > subview.frame.size.width) 
                    [subview setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
                
                else 
                    [subview setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
                
            
            else if ([subview class] == NSClassFromString(@"UINavigationItemButtonView")) 
                // pretty sure this is always the back button
                buttonWidths += subview.frame.size.width;
                [subview setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
            
        


        if (titleView) 
            buttonWidths += 20; // seems to be apple indentation
            CGRect rect = titleView.frame;
            if (rect.size.width > self.frame.size.width - buttonWidths) 
                rect.size.width = self.frame.size.width - buttonWidths;
                titleView.frame = rect;
            

            titleView.center = self.center;
        
    

【讨论】:

【参考方案4】:

当我将[self.navigationController.navigationBar layoutSubviews] 包含在动画块本身中时,它对我来说效果很好。 下面是代码示例:

[UIView animateWithDuration:0.5
                 animations:^
                     [self.navigationController.navigationBar setFrame:newFrame];
                     [self.navigationController.navigationBar layoutSubviews];
                 ];

我希望这会有所帮助。

【讨论】:

不允许直接调用layoutSubviews

以上是关于UINavigationController:调整大小动画中的标题跳转的主要内容,如果未能解决你的问题,请参考以下文章

调整 UINavigationController 的大小?

使用 UINavigationController setToolbarHidden:animated 时如何调整视图大小:

使用平移关闭 UINavigationController 调整 UINavigationBar 相对于顶部安全区域的大小

如何在 UITabBarViewController 内的 UINavigationController 内调整 UITableView 的大小?

UINavigationController 总是全屏不调整大小

当 UISplitViewController 旋转为纵向时,如何调整 UINavigationController 内容的大小