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

时间:2011-01-21 11:09:58

标签: ipad ios animation uinavigationcontroller uinavigationbar

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

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

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

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

4 个答案:

答案 0 :(得分:3)

我用它来修复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 :(得分:2)

我最近遇到了类似的问题;我有一个动画视图的子视图,它立即跳到了新的位置。发生这种情况是因为我在该视图上调用了-layoutSubviews,因为我在动画结束之前以编程方式修改它。您是否正在做更改标题文本或以某种方式修改标题文本以导致-layoutSubviews被调用的内容?

答案 2 :(得分:1)

我的解决方案似乎可以解决我在应用中遇到的所有情况。显然仍然是一个黑客,所以不能保证它永远有效!

@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;
        }
    }
}

答案 3 :(得分:1)

当我在动画块中包含[self.navigationController.navigationBar layoutSubviews]时,它对我来说很好。 这是代码示例:

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

我希望这在某种程度上有所帮助。