UINavigationController: переходы заголовка в анимации изменения размера - PullRequest
7 голосов
/ 21 января 2011

У меня есть приложение для ipad, где я хотел бы скрыть и показать список категорий (вроде небольшого представления в контроллере разделенного представления) и основное представление, которое содержит стек UiNavigationController.

Я хотел бы изменить размер представления UINavigationController, чтобы заполнить весь экран, когда список категорий скрыт, и уменьшить, когда я показываю список.

У меня это работает, за исключением заголовкапанель навигации сразу переходит к своему новому смещению при установке кадра в блоке начала / принятия анимации.

Есть идеи, как остановить переход заголовка?

Ответы [ 4 ]

3 голосов
/ 13 марта 2012

Я использовал это для исправления этих переходов в 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

Надеюсь, это поможет вам; -)

2 голосов
/ 22 декабря 2011

Я недавно столкнулся с подобной проблемой; У меня было представление о анимации, которая сразу же переместилась на новую позицию. Это происходило из-за того, что -layoutSubviews вызывалось для этого представления в результате того, что я программно изменил его до завершения анимации. Вы делаете что-то вроде изменения текста заголовка или его изменения каким-либо образом, который вызовет -layoutSubviews для вызова?

1 голос
/ 18 апреля 2014

У меня все работало нормально, когда я включил [self.navigationController.navigationBar layoutSubviews] в сам блок анимации.Вот пример кода:

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

Надеюсь, это как-то полезно.

1 голос
/ 19 марта 2012

Мое решение, кажется, справляется со всеми сценариями, которые встречаются в моем приложении. Очевидно, все еще немного взломать, поэтому нет никаких гарантий, что он всегда будет работать!

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