2014-10-25 15 views
5

Tôi đã có thể thay đổi vị trí thẳng đứng của biểu tượng nút quay lại chứ không phải văn bản.Thay đổi vị trí dọc của văn bản nút quay lại trong UINavigationBar

Tôi đang sử dụng phương pháp layoutSubviews trong UINavigationBar:

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    BOOL fixed = NO; 
    NSArray *classNamesToReposition = @[@"_UINavigationBarBackIndicatorView", @"UINavigationButton", @"UINavigationItemButtonView"]; 
    for (UIView *view in [self subviews]) { 
     if ([classNamesToReposition containsObject:NSStringFromClass([view class])] && !fixed) { 
      CGRect frame = [view frame]; 
      if ([NSStringFromClass([view class]) isEqualToString:@"_UINavigationBarBackIndicatorView"]) { 
       frame.origin.y = 14.5; 
      } else if ([NSStringFromClass([view class]) isEqualToString:@"UINavigationButton"]) { 
       frame.origin.y = 9.0; 
      } else if ([NSStringFromClass([view class]) isEqualToString:@"UINavigationItemButtonView"]) { 
       frame.origin.y = 5.0; 
      } 
      [view setFrame:frame]; 
     } 
    } 
} 

Vấn đề là bất kỳ sự thay đổi khung tôi thực hiện trên UINavigationItemButtonView dường như không có bất kỳ tác dụng, cũng không phải bất kỳ sự thay đổi khung tôi thực hiện trên nó UILabel subview đó là văn bản nút thực tế. Khi tôi đăng nhập các khung nhìn, các khung dường như đang thay đổi nhưng văn bản không di chuyển trong chế độ xem của tôi. Tôi đang làm gì sai?

+0

Jack, bạn đã thử đặt mã đó trong 'viewDidAppear:' thay thế? Tôi đã thử nghiệm trên một dự án của tôi và nó thiết lập vị trí y. – carlodurso

Trả lời

4

Bạn phân lớp UINavigationBar có tên MyNavigationBar, trong layoutSubviews, thay đổi vị trí chỉ báo trở lại.

for (UIView *view in [self subviews]) { 
    CGRect frame = [view frame]; 
    if ([NSStringFromClass([view class]) isEqualToString:@"_UINavigationBarBackIndicatorView"]) { 
     frame.origin.y = 19.5; //default is 11.5, move down by 8. 
    } 
    [view setFrame:frame]; 
} 

Và bạn có thể thay đổi vị trí tiêu đề củaBarItem bằng cách thêm điều này vào ứng dụngĐã hoàn thành.

[[UIBarButtonItem appearanceWhenContainedIn:[MyNavigationBar class], nil] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, 8) forBarMetrics:UIBarMetricsDefault]; 
+0

Các khối mã đó có loại trừ lẫn nhau hay không; bạn có thể thiết lập vị trí bằng cách sử dụng [UIBarButtonItem appearanceWhenContainedIn ...] một mình, hay bạn cần phải lặp qua các khung nhìn? –

+0

Không, tôi phải thêm cả hai, đầu tiên là thay đổi chỉ báo trở lại (mũi tên quay lại), thứ hai là thay đổi tiêu đề của backbarItem, đây là [example] (https: //www.dropbox) .com/s/uh0d7f258diynrs/VeticalPosition.zip? dl = 0) trong trường hợp bạn muốn xem nó hoạt động như thế nào. – gabbler

+0

Đây là điều tuyệt vời, nhưng tiếc là việc bỏ liên kết văn bản từ mũi tên quay lại làm self.navigationItem.hidesBackButton = YES; chỉ ẩn mũi tên quay lại không may. Bạn đã tìm ra một giải pháp cho tình huống khó xử này? –

Các vấn đề liên quan