2015-07-26 2 views
1

Я использую расширенную панель навигации для своего приложения, увеличивая ее высоту на 30 пунктов. Чтобы сделать это, я подклассы UINavigationBar, вот мой CustomNavigationBar.m:Переход iOS с расширенной навигационной панелью

CGFloat CustomNavigationBarHeightIncrease = 30.f; 

@implementation CustomNavigationBar 

- (CGSize)sizeThatFits:(CGSize)size { 

    CGSize amendedSize = [super sizeThatFits:size]; 
    amendedSize.height += CustomNavigationBarHeightIncrease; 

    return amendedSize; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder { 

    self = [super initWithCoder:aDecoder]; 

    if (self) { 
    [self initialize]; 
    } 

    return self; 
} 

- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 

    if (self) { 
     [self initialize]; 
    } 

    return self; 
} 

- (void)initialize { 

    [self setTransform:CGAffineTransformMakeTranslation(0, -(CustomNavigationBarHeightIncrease))]; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    NSArray *classNamesToReposition = @[@"_UINavigationBarBackground"]; 

    for (UIView *view in [self subviews]) { 

     if ([classNamesToReposition containsObject:NSStringFromClass([view class])]) { 

      CGRect bounds = [self bounds]; 
      CGRect frame = [view frame]; 
      frame.origin.y = bounds.origin.y + CustomNavigationBarHeightIncrease - 20.f; 
      frame.size.height = bounds.size.height + 20.f; 

      [view setFrame:frame]; 
     } 
    } 
} 

@end 

Затем в viewDidLoad контроллера зрения, я создал titleView свойство моего элемента навигации, как это:

self.navigationItem.title = @""; 
UIImage* logoImage = [UIImage imageNamed:@"welcome"]; 
self.navigationItem.titleView = [[UIImageView alloc] initWithImage:logoImage]; 
self.navigationItem.titleView.contentMode = UIViewContentModeScaleAspectFill; 
self.navigationItem.titleView.contentMode = UIViewContentModeBottom; 

и рама моего titleView имеет высоту 80 пунктов.

Все работает нормально до тех пор, но у меня есть проблема, когда я меняю контроллер вида (изображение использует изменения между контроллерами представлений). Как только начинается анимация, нижняя часть моего изображения (и только мое изображение в titleView, а не вся панель навигации) обрезается моей дополнительной высотой, переход происходит правильно (ну, только с оставшимся битом) и как только он будет завершен, появится обрезанный бит нового изображения.

Надеюсь, это ясно, похоже, я не могу получить анимацию на добавочном бите навигационной панели, которую я добавил.

Спасибо за вашу помощь, я действительно не знаю с чего начать.

ответ

1

Вместо подкласса UINavigationBar попробуйте настроить его. Это потребует от вас, чтобы установить ограничение в Interface Builder, чтобы компенсировать панель навигации размера, но это не так уж сложно: метод

#pragma mark - Navigation Bar Setup 

- (void)setupNavBar 
{ 
    [self.navigationController setNavigationBarHidden:NO animated:YES]; 

    self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent; 
    self.navigationController.navigationBar.barTintColor = [UIColor blackColor]; 

    [self.navigationController.navigationBar setBounds:CGRectMake(0, 0, self.view.frame.size.width, 80)]; 

// Customizing the back button in the Nav Bar 

    self.navigationItem.hidesBackButton = YES; 

    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    backButton.frame = CGRectMake(0, 0, 30, 30); 
    [backButton setImage:[UIImage imageNamed:@"backbtn"] forState:UIControlStateNormal]; 
    [backButton addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside]; 

    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 
    self.navigationItem.leftBarButtonItem = leftButton; 

    UIImage *title = [UIImage imageNamed:@"title_image"]; 
    UIImageView *titleImgView = [[UIImageView alloc] initWithImage:title]; 
    titleImgView.frame = CGRectMake(10, 15, 85, 24); 

    UIView *titleView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 105, 50)]; 
    [titleView addSubview:titleImgView]; 

    self.navigationItem.titleView = titleView; 
} 

Sample позвонить кнопку назад:

- (void)backButtonPressed 
{ 
    for (UIViewController *vc in self.childViewControllers) 
    { 
     if ([vc isEqual:[PinningVC class]]) 
     { 
      [vc removeFromParentViewController]; 
     } 
    } 

    [self.navigationController popViewControllerAnimated:NO]; 
} 
+0

Будьте уверены, чтобы вызвать методы перед отображением экрана - в 'viewWillAppear' или' viewDidLoad'. – ChrisHaze