2011-01-21 23 views
7

Tôi có một ứng dụng ipad mà tôi muốn ẩn và hiển thị danh sách danh mục (loại giống như chế độ xem nhỏ trong bộ điều khiển chế độ xem chia tách) và chế độ xem chính chứa ngăn xếp UiNavigationController.UINavigationController: Title Jumps in Resize Animation

Tôi muốn đổi kích thước chế độ xem UINavigationController để lấp đầy toàn bộ màn hình khi danh sách danh mục bị ẩn và thu nhỏ khi tôi hiển thị danh sách.

Tôi có nó hoạt động, ngoại trừ tiêu đề của thanh điều hướng ngay lập tức nhảy đến bù đắp mới của nó khi thiết lập khung trong một khối hình ảnh động bắt đầu/cam kết.

Bất kỳ ý tưởng nào về cách dừng bước nhảy của tiêu đề?

Trả lời

3

Tôi đã sử dụng tính năng này để sửa các bước nhảy đó trong UINavigationBar cho tiêu đề và nút bên phải.

#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 

Tôi hy vọng nó sẽ giúp bạn ;-)

+0

Xin chào, cảm ơn câu trả lời của bạn +1. Bạn chắc chắn đã chỉ cho tôi đúng hướng, nhưng tôi không thể chấp nhận câu trả lời của bạn theo cách nó là bởi vì nó ghê tởm! Không kiểm tra lớp học ... sẽ chỉ hoạt động nếu bạn chỉ có tiêu đề và nút RHS (nghĩa là không tuân theo nút quay lại). Nếu apple thay đổi xem thứ tự sau đó nó sẽ phá vỡ .. etc. Xin vui lòng gửi một giải pháp mạnh mẽ hơn cho câu trả lời được chấp nhận (hoặc tôi sẽ trả lời với giải pháp của riêng tôi)! Chúc mừng :) –

+0

Haha, chắc chắn là ghê tởm! :) Nó chỉ là một sửa chữa nhanh chóng trong dự án của tôi. Tốt hơn chưa? Giải pháp của bạn dựa trên điều gì? – Adam

+0

Vâng, tốt hơn, chấp nhận! sẽ đăng bài của riêng tôi cũng ... của bạn sẽ không đối phó với nút quay lại, và một số khác có thể scenarious, tôi nghĩ. –

2

Gần đây tôi đã gặp sự cố tương tự; Tôi đã có một cái nhìn cận cảnh về chế độ xem động đang nhảy ngay lập tức đến vị trí mới của nó. Điều này đã xảy ra vì -layoutSubviews đã được gọi trên chế độ xem đó do tôi đã sửa đổi chương trình trước khi hoạt ảnh kết thúc. Bạn đang làm điều gì đó như thay đổi văn bản của tiêu đề hoặc sửa đổi nó theo một cách nào đó có thể gây ra -layoutSubviews để được gọi vào nó?

+1

Tôi có một tình huống trong đó một đoạn mã được gọi là 'layoutIfNeeded' trong 'viewWillAppear'. Việc xóa 'layoutIfNeeded' đã xóa hoạt ảnh lạ. – greg

1

Giải pháp của tôi, dường như để đối phó với tất cả các tình huống tôi nhấn trong ứng dụng của tôi. Rõ ràng vẫn còn một chút của một hack, do đó, không có đảm bảo nó sẽ luôn luôn làm việc!

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

Nó hoạt động tốt cho tôi khi tôi bao gồm [self.navigationController.navigationBar layoutSubviews] trong khối hoạt ảnh. Đây là ví dụ về mã:

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

Tôi hy vọng điều này hữu ích.

+0

không được phép gọi '' 'layoutSubviews'''directly – CarlJ