2011-01-30 30 views
7

Tôi đang cố gắng sử dụng một mục tùy chỉnh cho nút quay lại trong thanh điều hướng của tôi.iphone - UIBarButtonItem tùy chỉnh cho nút quay lại

UIImage *backButtonImage = [UIImage imageNamed:@"backbutton.png"]; 
UIBarButtonItem *customItem = [[UIBarButtonItem alloc] initWithImage:backButtonImage style:UIBarButtonItemStylePlain target:nil action:nil]; 
[self.navigationItem setBackBarButtonItem: customItem]; 
[customItem release]; 

Điều tôi nhận được là hình ảnh của tôi có đường viền xung quanh. Nó trông giống như thế này (Hình ảnh của tôi là nút quay lại):

Back Button

Làm thế nào tôi có thể thoát khỏi biên giới? Tôi đang làm gì sai?

Trả lời

9

Hình ảnh của bạn xuất hiện bên trong nút quay lại và có vẻ như (từ ảnh chụp màn hình của bạn) không có cùng kích thước với nút quay lại.

Bạn có thể muốn ẩn nút quay lại và sau đó thay thế bằng nút "Thanh nút trái".

Code:

UIImage *backButtonImage = [UIImage imageNamed:@"backbutton.png"]; 
UIBarButtonItem *customItem = [[UIBarButtonItem alloc] initWithImage:backButtonImage style:UIBarButtonItemStylePlain target:self.navigationController action:@selector(popViewControllerAnimated:)]; 
[self.navigationController setHidesBackButton:YES]; 
[self.navigationItem setLeftBarButtonItem: customItem]; 
[customItem release]; 
+0

Cảm ơn câu trả lời của bạn. Tôi đã thử các kích thước hình ảnh khác nhau, nhưng không có kích thước nào trong số chúng hoạt động. Tôi luôn luôn có một đường viền xung quanh hình ảnh thu nhỏ của tôi. Một điều tương tự xảy ra nếu tôi sử dụng LeftBarButtonItem thay vì BackBarButtonItem. Bạn có biết bất kỳ dự án ví dụ nào bao gồm hình ảnh và mã hoạt động không? – Denny

+0

Không, tôi không biết về bất kỳ dự án nào, nhưng tôi có thể cố gắng đưa một dự án lại với nhau sau, tối nay. – Moshe

6

Dưới đây là một phiên bản cập nhật. Điều này bao gồm việc đặt mục tiêu, kích thước phông chữ, v.v.

Ngoài ra, điều này phản ánh rằng setHidesBackButton không khả dụng dưới dạng tài sản của navigationController.

UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *backButtonBackgroundImg = [UIImage imageNamed:@"BackButton.png"]; 
backButton.frame = CGRectMake(0.0f, 0.0f, backButtonBackgroundImg.size.width, backButtonBackgroundImg.size.height); 
[backButton setBackgroundImage:backButtonBackgroundImg forState:UIControlStateNormal]; 
[backButton addTarget:self action:@selector(didTouchUpInsideBackButton:) forControlEvents:UIControlEventTouchUpInside]; 
backButton.titleLabel.font = [UIFont boldSystemFontOfSize:[UIFont smallSystemFontSize]]; 
[backButton setTitle:@"MyTitle" forState:UIControlStateNormal]; 

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

Lưu ý rằng đây là từ một dự án ARC, vì vậy không có bản phát hành, vv trên các đối tượng.

+1

Cảm ơn bạn rất nhiều. Đây chính xác là những gì tôi cần, mà tôi không thể tìm thấy ở nơi khác. – James

1

Tôi đã tạo danh mục UINavigationBar mà tôi gọi trong viewWillAppear trong mỗi viewControllers của tôi. Các mã mà tôi sử dụng để thay đổi sự xuất hiện của nút quay lại của tôi là như sau:

UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(your button frame)]; 
[backButton setBackgroundImage:[UIImage imageNamed:@"your image name"] forState:UIControlStateNormal]; 
UIBarButtonItem *barBackButtonItem = [[UIBarButtonItem alloc] initWithCustomView: backButton]; 
[backButton addTarget:delegate action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside]; 
self.topItem.leftBarButtonItem = barBackButtonItem; 
self.topItem.hidesBackButton = YES; 

trình một cách hoàn hảo dưới iOS 6.

10

Xây dựng trên mã Jorge, đây là giải pháp của tôi.

tôi tạo ra một loại đơn giản trên UIViewController:

UIViewController + ImageBackButton.h

#import <UIKit/UIKit.h> 

@interface UIViewController (ImageBackButton) 

- (void)setUpImageBackButton; 

@end 

UIViewController + ImageBackButton.m

#import "UIViewController+ImageBackButton.h" 

@implementation UIViewController (ImageBackButton) 

- (void)setUpImageBackButton 
{ 
    UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 34, 26)]; 
    [backButton setBackgroundImage:[UIImage imageNamed:@"back_arrow.png"] forState:UIControlStateNormal]; 
    UIBarButtonItem *barBackButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 
    [backButton addTarget:self action:@selector(popCurrentViewController) forControlEvents:UIControlEventTouchUpInside]; 
    self.navigationItem.leftBarButtonItem = barBackButtonItem; 
    self.navigationItem.hidesBackButton = YES; 
} 

- (void)popCurrentViewController 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

@end 

Bây giờ tất cả các bạn phải làm là #import UIViewController+ImageBackButton.h trong cả v bộ điều khiển iew hoặc trong một cái nhìn cơ bản tùy chỉnh lớp điều khiển mà điều khiển xem khác kế thừa từ và thực hiện các phương pháp viewWillAppear::

- (void)viewWillAppear:(BOOL)animated 
{ 
    [self setUpImageBackButton]; 
} 

Đó là tất cả. Bây giờ bạn có một nút quay lại hình ảnh ở khắp mọi nơi. Không có đường viền. Thưởng thức!

+1

Cảm ơn người đàn ông ... Bạn đã tiết kiệm thời gian của tôi –

+1

Đây là một giải pháp tốt đẹp. Tôi tự hỏi nếu có một cách để tự động phát hiện khi nút quay lại tiêu chuẩn là trên màn hình để ngăn chặn phải ghi đè viewWillAppear mỗi lần. –

+0

@ IvanLesko Đó là một câu hỏi hay. Tôi chắc chắn phải có một cách. Nếu bạn đang tuyệt vọng và thất bại, bạn có thể lặp lại các bài kiểm tra của UINavigationBar. Nhưng đó nên là phương sách cuối cùng :) –

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