2012-04-11 47 views
22

Tôi đang cố gắng để tùy chỉnh phông chữ UINavigationBar của tôi, sử dụng đoạn mã sau dành cho iOS 5 trong ứng dụng của đại biểu tôi application:didFinishLaunchingWithOptions:Customize UINavigationBar phông chữ

if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) 
{ 
    [[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: 
                  [UIColor whiteColor], UITextAttributeTextColor, 
                  [UIColor blackColor], UITextAttributeTextShadowColor, 
                  [NSValue valueWithUIOffset:UIOffsetMake(1, 0)], UITextAttributeTextShadowOffset, 
                  [UIFont fontWithName:kDefaultFont size:0.0], UITextAttributeFont, 
                  nil]]; 
} 

Nó hoạt động tốt và thanh điều hướng được render sử dụng phông chữ của tôi. Tuyệt quá.

references Tôi thấy rằng bạn có thể sử dụng kích thước phông chữ bằng 0 và nó sẽ thay đổi kích thước phông chữ cho phù hợp với thanh điều hướng của bạn (sử dụng phông chữ hơi nhỏ hơn cho thanh điều hướng ngắn hơn cho bố cục ngang). Và nó chọn kích thước phông chữ phù hợp với chiều cao của thanh điều hướng. Nhưng có vẻ như nếu bạn đi từ chân dung đến ngang và sau, chiều rộng của nhãn tiêu đề của thanh điều hướng sẽ bị hỏng, vì vậy những gì hiển thị dưới dạng tiêu đề, ví dụ: "Thanh tiêu đề dài", có vẻ tốt khi bạn xem lần đầu tiên theo hướng dọc, trông đẹp khi bạn xem nó ở chế độ ngang (với phông chữ nhỏ hơn thích hợp), nhưng khi tôi quay lại chân dung, phông chữ sẽ hoàn nguyên về phông chữ lớn hơn, nhưng văn bản tiêu đề bị cắt ngắn, trở thành "Dài .. "mặc dù có rất nhiều không gian cho tiêu đề đầy đủ. Có ai khác nhìn thấy hành vi này khi sử dụng kích thước phông chữ là 0,0?

Rõ ràng, tôi chỉ có thể chỉ định kích thước phông chữ thực tế (trong trường hợp này tôi không thấy hành vi cắt xén này), nhưng sau đó tôi sẽ tự tìm ra kích thước cần sử dụng. Và tệ hơn nữa, kích thước phông chữ giống với phong cảnh và chân dung, vì vậy ngay bây giờ tôi đang sử dụng kích thước phông chữ phù hợp với tiêu đề thanh điều hướng ngang ngắn hơn và tiêu đề nhỏ hơn cần phải ở thanh điều hướng dọc cao hơn.

Có ai đó đã có kinh nghiệm sử dụng setTitleTextAttributes để thay đổi phông chữ của [UINavigationBar appearance] theo cách kích thước phông chữ thay đổi giữa dọc và ngang, nhưng không bị cắt xén tiêu đề này khi bạn quay lại chân dung sau khi để cảnh quan? Tôi sắp theo đuổi nhiều cách giải quyết khác nhau, nhưng nếu bạn có bất kỳ kinh nghiệm nào về vấn đề này, hãy cho tôi biết.

Cập nhật:

Trong quá trình nộp lỗi này cho Apple, tôi quyết định để chứng minh làm thế nào để tạo lại vấn đề:

  1. Tạo mới iOS Master-Detail ứng dụng trong Xcode 4.3. 2.

  2. Đặt mã setTitleTextAttributes ở trên trong ứng dụng của đại biểu application:didFinishLaunchingWithOptions (Tôi đã sử dụng phông chữ @ "GillSans").

  3. Tới MasterViewController và thêm dòng mà nói self.title = @"Long Title";

  4. luận ra các mã UIBarButtonItem *addButton.

  5. Chạy chương trình. Lưu ý tiêu đề có nội dung chính xác là "Tiêu đề dài". Xoay ngang. Dường như vẫn ổn. Xoay trở lại chân dung và tiêu đề bây giờ nói "Long ..." mặc dù có nhiều không gian.

  6. Thật kỳ lạ, nếu bạn khôi phục mã UIBarButtonItem *addButton, tiêu đề sẽ hoạt động như bình thường. Nhưng nếu bạn loại bỏ mục UIBarButton, hoặc thay thế bằng nút sử dụng initWithTitle thay vì initWithBarButtonSystemItem, bạn sẽ gặp vấn đề với tiêu đề thanh điều hướng sau khi xoay từ dọc sang ngang và sau đó quay lại dọc.

+0

Tôi gặp sự cố trong đó tiêu đề thanh điều hướng phông chữ tùy chỉnh của tôi bị "cắt bớt sớm" lần đầu tiên chúng được hiển thị nhưng sau đó vẫn ổn. Dường như là một iOS 6-ism. Dù sao, phát hiện ra tôi có thể thiết lập kích thước font chữ để giải quyết vấn đề. Cảm ơn! – mharper

+1

Điều thú vị trên trình mô phỏng iOS5.1 bằng cách sử dụng phương thức này, tiêu đề bị cắt ngắn * trong suốt quá trình chuyển đổi pushModalViewController, nhưng xuất hiện tốt khi quá trình chuyển đổi hoàn tất. Trên trình mô phỏng iOS 6.0, nó hoạt động như mong đợi. –

Trả lời

1

sau đây là cách giải quyết của tôi cho vấn đề này, và đây là những nhận xét đó xuất hiện bên cạnh thực hiện cách giải quyết của tôi trong từng trường hợp như một lời nhắc nhở với chính mình là tại sao tôi thực hiện chút mã này:

// when using an appearance proxy to set a custom font for the navigation bar (generally in 
// application:didFinishLaunchingWithOptions: in the appDelegate code) for both iOS 5 & 6, 
// there's a glitch that incorrectly auto-truncates the title in the following cirumstances: 
// 
// 1) when a 0.0 value is used for UITextAttributeFont in the titleTextAttributes dictionary 
// and a device/simulator running pre-iOS 5 rotates back to portrait from landscape 
// solution: perform [self.navigationController.navigationBar setNeedsLayout] in 
//    didRotateFromInterfaceOrientation: the view controller in which the 
//    auto-truncation is incorrectly occurring for systemVersion < 6.0 
// 
// 2) when a view initially loads running iOS 6 for a non-0.0 value for the UITextAttributeFont 
// in the titleTextAttributes dictionary 
// solution: perform [self.navigationController.navigationBar setNeedsLayout] 
//    in viewDidLoad in the view controller in which the auto truncation is 
//    incorrectly occurring for systemVersion >= 6.0 

như vậy, đối với trường hợp tôi ok với việc sử dụng các giá trị 0.0 cho UITextAttributeFont nhưng phải tiếp tục hỗ trợ iOS5, tôi sử dụng dung dịch (1):

#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0 
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation) 
     && UIDevice.currentDevice.systemVersion.floatValue < 6.0) 
     [self.navigationController.navigationBar setNeedsLayout]; 
} 
#endif 

và trong t anh ta vài trường hợp mã di sản mà tôi muốn hỗ trợ iOS 6 và khắc phục sự cố khi khung nhìn xuất hiện lần đầu mà không phải viết lại phương thức lớp MyAppAppearance tôi đã đặt giá trị không 0.0 cho số [UINavigationBar appearance] titleTextAttributes của mình, tôi thấy dễ dàng hơn thực hiện các giải pháp (2) như sau:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0 
    if (UIDevice.currentDevice.systemVersion.floatValue >= 6.0) 
#endif 
     [self.navigationController.navigationBar setNeedsLayout]; 

    // … other viewDidLoadCode 

(và khung __IPHONE_OS_VERSION_MIN_REQUIRED chỉ giúp nhắc nhở tôi mà mã cuối cùng có thể đi xa nếu muốn trong tương lai, và có thể phải ở lại.)

để xem chính xác hơn một chút những gì xảy ra ở đây, đặc biệt trong trường hợp quay vòng, hãy chạy trình mô phỏng với hoạt ảnh chậm được bật.

1

Tôi nghĩ giải pháp tốt là làm mới tiêu đề của thanh điều hướng của bạn sau khi xoay thiết bị. Một cái gì đó như

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 

     self.navigationItem.title = @"Your title"; 

} 

Hy vọng điều này sẽ hữu ích!

+0

Đó là, tất nhiên, một trong những điều đầu tiên tôi đã thử. Không vui. – Rob

3

Nhân tiện, tôi đã bỏ qua để chỉ ra rằng Apple đã trả lời báo cáo lỗi của tôi, thừa nhận rằng đây là một vấn đề đã biết. Hy vọng rằng nó sẽ sớm được giải quyết!

1

Dựa trên phản hồi từ @Abramodj (không hoạt động), tôi đã thử cách này. Có lẽ không có gì xảy ra trong giải pháp đó vì hệ thống nhận thấy rằng văn bản đã không thực sự thay đổi. Chuyển sang không có gì và trở lại một lần nữa sắp xếp nó ra.

Được thử nghiệm là chắc chắn hoạt động trên iOS5.0.

// iOS5 has a bug where if you switch orientation the title bar text gets cut off... 
-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation  { 
    self.navigationItem.title = @""; 
    self.navigationItem.title = @"Your Title"; 
} 
0

Lỗi khi văn bản tiêu đề UINavigationBar bị cắt sau khi áp dụng các thay đổi thông qua giao diện có thể xảy ra ngay cả khi bạn không thực hiện chuyển hướng như Ben Clayton mô tả. Tôi đã thấy sự cố này xảy ra trên một ứng dụng chỉ hỗ trợ hướng dọc.

[self.navigationItem setTitle:@""]; 
[self.navigationItem setTitle:@"The real title"]; 

Sẽ hoạt động tốt ngay cả trong trường hợp như vậy.

Nhân tiện, tôi đã gặp phải sự cố này kể từ iOS 5. Chỉ cần kiểm tra nó ngay bây giờ trong iOS 6 và CNTT ĐÃ S STN. Cái quái gì thế, Apple?

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