7

Tôi đang cố gắng để tùy chỉnh backBarButtonItem với một hình ảnh tùy chỉnh (văn bản 'trở lại' được bao gồm trong hình ảnh đó), đây là kết quả hiện tại:Tùy chỉnh BackBarButtonItem

http://i.imgur.com/rFxFt.png

Có ai biết tại sao điều này có thể xảy ra?

Dưới đây là mã của tôi trên viewDidLoad (thực sự chạy cả trên bộ điều khiển phụ huynh và sau đó một lần nữa trên bộ điều khiển mới có nút quay lại)

UIImage *backButtonImage = [UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"]; 


UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
           initWithImage:backButtonImage 
           style:UIBarButtonItemStylePlain 
           target:nil 
           action:nil]; 


self.navigationItem.backBarButtonItem = backButton; 

Chỉnh sửa: Tôi đang sử dụng iOS 5 bằng cách này! Có lẽ proxy xuất hiện là có thể sử dụng nhưng cho đến nay khi tôi cố gắng sử dụng nó cho các công cụ nút quay lại (trong appDelegate) các ứng dụng treo đơn giản.

+0

đảm bảo phê duyệt câu trả lời phù hợp! –

Trả lời

16

Được rồi tôi giải quyết vấn đề này, sử dụng một chút của một thủ thuật thô, nhưng ít nhất nó hoạt động. Nếu bất cứ ai đưa ra một giải pháp tiêu chuẩn hơn mặc dù, xin vui lòng cho tôi biết!

Dưới đây là mã của tôi:

UIImage *backButtonImage = [[UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault]; 

Đây là trong phương pháp appdelegate tôi:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

Để ngăn chặn nó kéo dài khi sử dụng nó như là một nền tảng, tôi đã sử dụng ý tưởng từ iOS 5: How to implement a custom (image) back button

Nhưng sau đó tinh chỉnh nó thay vì phải thiết lập-

self.title = @" "; 

Trên mỗi tải view (và mà có thể còn gây rối với tiêu đề thanh nav chính nó)

tôi chỉ thiết lập bù đắp cho nút văn bản 'trở lại' để gấp đôi chiều cao hình ảnh, vì vậy bạn sẽ không bao giờ nhìn thấy nó.

Tại sao lại gặp phải tất cả sự cố này, thay vì sử dụng mục nút trái với phương pháp riêng để bật trình điều khiển chế độ xem?

Lý do chính là bạn mất hoạt ảnh trượt nút quay lại chuẩn để thay đổi chế độ xem. Ngoài ra, điều này có nghĩa là tôi không cần sử dụng nút tùy chỉnh hoặc viết phương thức tùy chỉnh để quay lại. Nó chỉ đơn giản là hoạt động.

Hy vọng điều này cũng giải quyết được vấn đề của người khác, tôi biết tôi đã bị kẹt trong đó trong 3 giờ!

+0

kiểm tra câu trả lời của tôi, tránh sự cố kéo dài hình ảnh và điều chỉnh vị trí tiêu đề. – Gon

0

Ký hiệu "UIBarButtonItemStylePlain" chỉ định kiểu nút.

Hãy thử tạo nút quay lại của bạn theo cách này thay vì:

UIImage *backButtonImage = [UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"]; 
CGRect frameimg = CGRectMake(0, 0, backButtonImage.size.width, backButtonImage.size.height); 
UIButton *someButton = [[UIButton alloc] initWithFrame:frameimg]; 
[someButton setBackgroundImage:backButtonImage forState:UIControlStateNormal]; 
// you have to do your own backButtonAction to pop the view controller, b.t.w. 
[someButton addTarget:self action:@selector(backButtonAction:) 
    forControlEvents:UIControlEventTouchUpInside]; 
[someButton setShowsTouchWhenHighlighted:YES]; 

UIBarButtonItem *backButton =[[UIBarButtonItem alloc] initWithCustomView:someButton]; 
[someButton release]; 

self.navigationItem.backBarButtonItem = backButton; 
+0

Cảm ơn vì nỗ lực của Michael, nhưng khi tôi sử dụng mã của bạn, nút quay lại chỉ đơn giản là hoàn nguyên hoàn toàn kiểu màu xanh bình thường mà không có tùy chỉnh. (Tôi nghĩ rằng tôi đã thử rất nhiều biến thể tương tự như phương pháp này) Tôi nhận thấy từ dòng 'phát hành' của mã mà tôi nên chỉ ra rằng tôi đang sử dụng iOS 5! Vì vậy, điều này có thể thay đổi rất nhiều, sai lầm của tôi không làm cho rõ ràng ban đầu. –

+4

Trạng thái tài liệu của Apple: ** Khi định cấu hình mục nút thanh của bạn, không chỉ định chế độ xem tùy chỉnh cho mục đó; tuy nhiên, mục điều hướng bỏ qua các chế độ xem tùy chỉnh trong nút thanh trở lại. ** –

+1

@AshleyMills khá đúng. Câu trả lời này chỉ hoạt động cho 'leftBarButtonItem' và' rightBarButtonItem', không phải cho 'backBarButtonItem'. – Gon

0

Trong trường hợp này tôi tìm thấy nó dễ dàng hơn để thay thế cho barButtonItem, chỉ đơn giản với một nút tùy chỉnh.

Không chắc chắn chính xác bạn đã thiết kế dự án như thế nào, nhưng nó có hiệu quả đối với tôi.

The setting for the custom button

The back button, resulting look

Sau đó đính kèm mã này vào nó:

//go back to the previous screen 

-(IBAction)back{ 

[self dismissModalViewControllerAnimated:YES]; 

} 
+1

Đó là tất cả tốt nhưng sau đó tôi bị mất các hoạt hình trượt tiêu chuẩn khi tôi bật bộ điều khiển xem. Nó cũng xảy ra cho dự án này, tôi không sử dụng các trình xây dựng giao diện hoặc các tệp nib/xib. Tôi lập trình tạo mọi thứ. –

+0

Không thực sự đe dọa câu hỏi của mình. Bạn mất khả năng sử dụng và sử dụng tiêu chuẩn UINavigationBar –

0

Tôi đã thử nó rất nhiều ngay hôm nay và nhận giải pháp này. Nó tách hình ảnh hình nềnảnh, có vẻ dễ dàng hơn và không phức tạp.

UIImage *bgImage = [UIImage imageNamed:@"the-same-image-as-your-navbar-background-image"]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:bgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:bgImage forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 

UIImage *buttonImage = [UIImage imageNamed:@"your-back-button-image"]; 
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:buttonImage style:UIBarButtonItemStylePlain target:nil action:nil]; 
self.navigationItem.backBarButtonItem = backButton;