2009-03-20 28 views

Trả lời

62

Nếu bất cứ ai đang tìm kiếm chính xác mã để lặp lại một UIBarButtonItem đơn giản:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
[button setBackgroundImage:[UIImage imageNamed:@"delete.png"] forState:UIControlStateNormal]; 
[button setTitle:@"Delete" forState:UIControlStateNormal]; 
button.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:12.0f]; 
[button.layer setCornerRadius:4.0f]; 
[button.layer setMasksToBounds:YES]; 
[button.layer setBorderWidth:1.0f]; 
[button.layer setBorderColor: [[UIColor grayColor] CGColor]]; 
button.frame=CGRectMake(0.0, 100.0, 60.0, 30.0); 
[button addTarget:self action:@selector(batchDelete) forControlEvents:UIControlEventTouchUpInside]; 

UIBarButtonItem* deleteItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 

Và delete.png là:

delete.png

+8

Một lưu ý bổ sung: bạn cần phải thêm thư viện QuartzCore vào dự án của bạn và nhập nó vào lớp của bạn để sử dụng các phương thức CALayer. – Johanisma

+6

Để lưu những người khác phải tìm kiếm: # import

+2

Tôi nghĩ bán kính góc mặc định có thể là 5.0f thay vì 4.0f. Ngoài ra, mọi người cũng có thể thích sử dụng hình ảnh rộng 1 pixel để giữ hình ảnh nhỏ. Bài đăng này là hữu ích, mặc dù, cảm ơn! –

1

Bạn có thể tạo hình ảnh tùy chỉnh cho nút và sử dụng nút đó. Khác, nếu bạn đã đặt tintColor của thanh điều hướng hoặc thanh công cụ thành màu đỏ, các mục nút trên các mục này cũng sẽ xuất hiện màu đỏ.

3

Sử dụng hình ảnh tùy chỉnh không hoạt động vì nó chỉ sử dụng alpha để hiển thị nút.

26

Bạn có thể tạo UIButton tùy chỉnh với giao diện mong muốn và khởi tạo UIBarButtonItem của bạn với giao diện tùy chỉnh.

UIButton *button = [UIButton buttonWithType:....]; 
...(customize your button)... 

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button]; 
+1

Nhưng điều này không cung cấp cho bạn UIBarButtonItem khớp với kết xuất mặc định của iOS, trừ khi bạn sẵn sàng sao chép cẩn thận hành vi hiển thị mặc định của iOS như Scott. Tuy nhiên, nếu bạn muốn thoát khỏi giao diện mặc định thì đây rõ ràng là cách để đi. – charshep

0

Nếu sử dụng IB (Interface Builder), kéo một UIView từ Thư viện lên UIToolBar, và nó sẽ tạo ra một UIBarButtonItem với một giao diện tùy chỉnh. Sau đó, bạn có thể thêm bất kỳ điều khiển nào khác mà bạn muốn, ví dụ: UIButton, UILabel, UIActivityIndicatorView.

1

Nếu nó là UIBarButtonItem của một UIToolbar

thiết lập điều này trước khi triển khai trong tệp bạn muốn mã này

@class UIToolbarTextButton; 

Sau đó thay đổi các nút trên thanh công cụ thực hiện điều này:

for (UIView *view in self.navigationController.toolbar.subviews) { 
     NSLog(@"%@", [[view class] description]); 
     if ([[[view class] description] isEqualToString:@"UIToolbarTextButton"]) { 
      [(UIToolbarTextButton *)view setTintColor:yourcolor]; 
     } 
    } 
2

Được rồi, có thực sự là một giải pháp tốt hơn nhiều để này, theo ý kiến ​​của tôi, trong đó bao gồm ít mã và sử dụng các điều khiển giao diện người dùng tự nhiên.

Bí quyết là sử dụng UISegmentedControl và xóa tất cả các phân đoạn ngoại trừ một phân đoạn. (Không thể được thực hiện trong IB, phải được thực hiện theo chương trình).

Khi bạn đã thực hiện điều đó, bạn đặt màu tô màu, sau đó tạo UIBarButtonItem truyền cho nó UISegmentedControl làm chế độ xem tùy chỉnh.

anh chàng này đã sử dụng kỹ thuật này để tạo ra một chủng loại UIBarButtonItem mà hoạt động rực rỡ:

http://fredandrandall.com/blog/2011/03/31/how-to-change-the-color-of-a-uibarbuttonitem/

+0

Đề xuất tuyệt vời nếu bạn phải hỗ trợ 4,3 như tôi. Tôi đang đi với các thể loại như chi tiết trong liên kết. –

7

Bạn có thể thiết lập thuộc tính của một UIBarButtonItem tintColor trong iOS 5. Nếu bạn cần hỗ trợ iOS 4, kiểm tra ra this blog post. Nó chi tiết bằng cách sử dụng một UISegmentedControl theo kiểu để trông giống như một nút duy nhất.

0

Tôi muốn thêm thứ gì đó vào giải pháp được đánh dấu. Nếu bạn làm điều này subclassing, nó sẽ không thực hiện segboard-defied segues và selectors được gán cho UIBarButtonItem. Hơn nữa, các thuộc tính 'target' và 'action' không được đặt trong UIBarButtonItem, do đó bạn không thể truy cập chúng từ lớp con và gán chúng cho UIButton của bạn.

tôi làm việc này bằng cách bổ sung thêm 2 tính để lớp con của tôi (sử dụng ARC):

@property (nonatomic, weak) id targetViewController; 
@property (nonatomic, strong) NSString *segueIdentifier; 

Tiếp theo, trong init của lớp con của bạn, thêm một cái gì đó như thế này để mã câu trả lời được chấp nhận:

[button addTarget:self action:@selector(performAction) forControlEvents:UIControlEventTouchUpInside]; 

và một chức năng:

- (void)performAction { 
    if (_targetViewController && _segueIdentifier) { 
     [_targetViewController performSegueWithIdentifier:_segueIdentifier sender:self]; 
    } else { 
     NSLog(@"Requires targetViewController and segueIdentifier to be set"); 
    } 
} 

cuối cùng, trong điều khiển giao diện chính của bạn đó là lưu trữ tất cả những điều này, trong mục 'viewDidLoad', thêm này:

_fancyBarButtonItem.segueIdentifier = @"NewTransaction"; 
_fancyBarButtonItem.targetViewController = self; 

Hy vọng điều này sẽ giúp người khác tiết kiệm thời gian khi họ bắt đầu xuống con đường này với Storyboards/iOS5

36

Tại sao không chỉ:

[[self editButtonItem] setTintColor:[UIColor redColor]]; 

(trên sdk 4. *, ios 5 trở lên)

+0

tuyệt. Đây là hoàn hảo. – Viraj

+0

Cảm ơn. của nó rất dễ dàng – iMeMyself

+0

Chỉ cần những gì là cần thiết. Cảm ơn. – jkcl

0

Khi bạn đã thiết lập UIBarButtonItem trong một Storyboard, bạn phải thiết lập các tintColor trong viewWillAppear() hoặc viewDidAppear() phương pháp (đặt nó trong viewDidLoad() không làm việc cho tôi ...):

- (void)viewWillAppear { 
    [super viewWillAppear]; 
    [[self editButtonItem] setTintColor:[UIColor redColor]]; 
} 

Hoặc trong Swift:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    editButtonItem.tintColor = UIColor.redColor() 
} 

Lưu ý: thử nghiệm trên iOS 8/9.

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