2013-08-07 42 views
5

Tôi muốn đặt nút thanh tùy chỉnh trở lại cho tất cả các bộ điều khiển trong ứng dụng. Tôi đã thử sử dụng tính năng này:đặt nút thanh tùy chỉnh trở lại phổ quát mà không có tiêu đề

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

Nó đặt hình ảnh. Vậy là được rồi. Nhưng, những gì tôi thực sự muốn làm là, tôi chỉ muốn một nút tùy chỉnh cho nút thanh trở lại mà không chứa bất kỳ tiêu đề vv Mã trên hoạt động, nhưng nó thêm tiêu đề tự động và thay đổi kích thước mục nút thanh trở lại. Nhu cầu của tôi là có một khung cố định, không có tiêu đề trở lại mục nút thanh cho tất cả các bộ điều khiển trong ứng dụng.

+0

bạn đã thử barBtn.title = @ ""; ??? – Suryakant

+1

Làm như vậy sẽ ẩn toàn bộ nút. –

+0

Nếu bạn đặt kiểu là BarButtonItem, bạn sẽ không nhận được nút quay lại tùy chỉnh. Tôi nên thêm UIButton tùy chỉnh. – Subrat

Trả lời

5

Tôi đã giải quyết. Chỉ cần tạo một danh mục trên UIViewController và nhập nó vào tệp prefix.pch. Sau đó viết một phương pháp: customViewWillAppear: và sự gian lận nó với phương pháp viewWillAppear:

+(void)load{ 

Method viewWillAppear = class_getInstanceMethod(self, @selector(customViewWillAppear:)); 

Method customViewWillAppear = class_getInstanceMethod(self, @selector(viewWillAppear:)); 
method_exchangeImplementations(viewWillAppear, customViewWillAppear); 

}

Thêm các phương pháp trên cho danh mục lớp. Sau đó, triển khai phương thức customViewWillAppear của bạn như sau:

-(void)customViewWillAppear:(BOOL)animated{ 
    [self customViewWillAppear:animated]; 
    if([self.navigationController.viewControllers indexOfObject:self] != 0 && !self.navigationItem.hidesBackButton){ 
     UIBarButtonItem *cancelBarButton = nil; 
     UIButton* cancelButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
     [cancelButton addTarget:self action:@selector(popViewControllerWithAnimation) forControlEvents:UIControlEventTouchUpInside]; 
     [cancelButton setBackgroundImage:[UIImage imageNamed:@"yourImage.png"] forState:UIControlStateNormal]; 
     [cancelButton sizeButtonToFit]; 

     cancelBarButton = [[UIBarButtonItem alloc] initWithCustomView:cancelButton]; 

     NSMutableArray * leftButtons = [NSMutableArray arrayWithObject:cancelBarButton]; 
     [leftButtons addObjectsFromArray:self.navigationItem.leftBarButtonItems]; 
     [self.navigationItem setLeftBarButtonItem:nil]; 
     [self.navigationItem setLeftBarButtonItems:leftButtons]; 
    } 

    [self.navigationItem setHidesBackButton:YES]; 
} 
-(void)popViewControllerWithAnimation{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

Bây giờ, đối với mọi bộ điều khiển trong mã của bạn, bạn có nút quay lại tùy chỉnh. Điều này đã cho tôi rất nhiều thời gian để thực hiện và tìm ra. Hy vọng nó cũng sẽ giúp các bạn.

EDIT: Vui lòng sử dụng mã sau để hỗ trợ iOS7> tính năng vuốt ngược;

UIImage *image = [UIImage imageForName:@"some_image"]; 
navBar.backIndicatorImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
navBar.backIndicatorTransitionMaskImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 

Tạo bộ điều khiển chế độ xem cơ sở và thêm mã sau;

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; 
} 
+0

Cảm ơn bạn rất nhiều vì mã này! Vấn đề duy nhất tôi đã tìm thấy cho đến nay là bây giờ nó không thể kéo bộ điều khiển xem từ cạnh trái sang phải để bật nó từ ngăn xếp chuyển hướng – skornos

+0

Có đúng với các thiết bị có iOS 7 trở lên. – rordulu

+0

ok, tôi đã tìm thấy giải pháp khác cho vấn đề này, bạn cần đặt trình điều khiển chế độ xem làm đại biểu cho trình nhận dạng cử chỉ tương tác với 'self.navigationController.interactivePopGestureRecognizer.delegate = (id ) self;' inside 'customViewWillAppear' – skornos

2

Tôi đã gặp vấn đề tương tự trước đây và tôi đã tìm kiếm ở mọi nơi để tìm giải pháp.

Chỉ có một trong những tôi đã tìm thấy, mà làm việc cho vấn đề của bạn là để thực hiện trong MỌI xem điều khiển một UILeftBarButton mà popping.

Bạn có thể thay đổi hình nền theo cách bạn đang làm, nhưng nếu bạn đặt văn bản thành nil hoặc văn bản trống (""), thì nút của bạn sẽ không hiển thị.

Bạn cũng không thể thay đổi Chế độ xem của UIBackBarButton, chỉ văn bản của nó (vì vậy không có nút tùy chỉnh).

+0

Tôi đã có hàng chục bộ điều khiển, hoạt động này quá đắt đối với tôi. – rordulu

+0

Bạn sẽ không thể thay đổi nền của nút quay lại và xóa văn bản (Apple đã làm điều này trong khi có nội địa hóa trong tâm trí, vì bạn không nên thêm văn bản vào hình ảnh, thay vào đó hãy thêm văn bản vào mã) –

2

Những gì tôi đã làm, đã đặt nhãn tiêu đề backbutton alpha thành 0, sử dụng proxy xuất hiện.

+0

bạn có thể chia sẻ bất kỳ mã nào không ? Tôi không nghĩ rằng bạn có thể truy cập titlelabel của một uibarbuttonitem. Ngay cả khi bạn làm, nó sẽ chỉ thiết lập khả năng hiển thị của tiêu đề, backbutton vẫn sẽ thay đổi khung của nó như thay đổi kích cỡ theo tiêu đề. – rordulu

+0

Tôi không ở phía sau bàn làm việc của tôi, nhưng nếu bạn điều chỉnh phông chữ thành ngớ ngẩn 0,1 thì sẽ không thể phát hiện được. Sử dụng '[[UIBarButtonItem xuất hiện] setTitleTextAttributes ...' –

0

thử mã này:

UIButton *tempbtn = [[UIButton alloc] init]; 
[tempbtn setImage:[UIImage imageNamed:@"testbtn.png"] forState:UIControlStateNormal]; 
UIBarButtonItem *temp = [[UIBarButtonItem alloc] initWithCustomView:tempbtn]; 
self.navigationItem.rightBarButtonItem = temp; 
+0

bạn không cần đặt tiêu đề của UIBarbuttonsystemItems.Và bạn cũng không cần đặt tiêu đề cho hình ảnh. – NHS

1

Bạn có thể viết một thể loại như thế này,

// 
// UINavigationItem+BarAditions.h 
// 
// Created by Satheeshwaran on on 7/5/13. 
// 


#import <Foundation/Foundation.h> 


@interface UINavigationItem (PersonaAddition) 

- (void)setCustomBackButton; 

@end 


// 
// UINavigationItem+BarAditions.m 
// 
// Created by Satheeshwaran on on 7/5/13. 
// 

#import "UINavigationItem+PersonaAddition.h" 


@implementation UINavigationItem (PersonaAddition) 

- (void)setCustomBackButton 
{ 
    //customize ur back button here. 
    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    backButton.frame=CGRectMake(0, 0, 60, 30); 
    [backButton addTarget:target action:@selector(didPressLeftItem:) forControlEvents:UIControlEventTouchUpInside]; 
    UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 
    self.leftBarButtonItem = barItem;  

} 

và nhập khẩu loại này ở tất cả các file ur và gọi setCustomBackButton trong mọi tầng lớp ur. Điều này phù hợp với tôi, ngay cả trong iOS 7.

Trong ViewDidLoad của tất cả các lớp học ur.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self.navigationItem setCustomBackButton]; 

} 
1

Mã của tôi trong ViewDidLoad:

// Set back button image 
if ([[self.navigationController viewControllers] objectAtIndex:0] != self) { 
    UIButton *btnBack = [UIButton buttonWithType:UIButtonTypeCustom]; 
    btnBack.frame = CGRectMake(0,0,38,30); 
    [btnBack setBackgroundImage:[UIImage imageNamed:@"NavigationBarBackButton"] forState:UIControlStateNormal]; 
    [btnBack addTarget:self.navigationController action:@selector(popViewControllerAnimated:) forControlEvents:UIControlEventTouchUpInside]; 
    UIBarButtonItem *leftBtn = [[UIBarButtonItem alloc] initWithCustomView:btnBack]; 
    [self.navigationItem setLeftBarButtonItem:leftBtn]; 
} 
Các vấn đề liên quan