9

Tôi có thanh công cụ UIToolbar chứa 2 nút. Thanh công cụ có một màu:Cách tô màu nền UIBarButtonItem?

toolbar.tintColor = [UIColor colorWithRed:(102.0/255.0) green:(20.0/255.0) blue:(11.0/255.0) alpha:1]; 

Làm cách nào để làm cho các nút có màu tương tự?

Trả lời

8

Điều tốt nhất cần làm là đặt tintColor SAU bạn thêm các nút vào nó, như trong iOS 4.0, nó không còn cập nhật các nút được thêm vào thanh sau khi tintColor đã được đặt.

2

xem "Thay đổi màu sắc của UINavigationBarButtons"

EDIT: Tôi loại bỏ các liên kết vì miền xuống ...

Các là văn bản từ bộ nhớ cache google:


Được rồi, đây là một mẹo nhanh khác. "Làm thế nào để thay đổi màu sắc của một nút trên thanh công cụ." Tất nhiên, điều này có thể được áp dụng cho bất kỳ thanh công cụ nhưng tôi sẽ chứng minh các thủ tục trên một UINavigationBar.

Hình ảnh trên chỉ hiển thị một vài màu. Trong sự thật, bạn có thể làm cho nút bất kỳ màu nào mà bạn muốn. Tuyệt diệu! Mã thực sự đơn giản để làm điều này là tốt. Điều đầu tiên mà chúng tôi muốn làm là mở tập tin tiêu đề cho bất kỳ đối tượng nào sẽ chuyển một nút thanh nav một màu khác và khai báo lớp UINavigationButton về phía trước. Bạn có thể nhận được lớp này bằng cách lặp qua các bản xem con của UINavigationBar, đọc các tên lớp con của nó, hoặc bởi lớp UIKit bán phá giá nếu bạn có một thiết bị bẻ khóa.

Nơi dòng sau trước khi tuyên bố giao diện của bạn:

@class UINavigationButton; 

Bây giờ, khai báo một phương pháp mới trong tiêu đề mà chúng ta sẽ sử dụng để thực sự thay đổi màu sắc của nút.

- (void)changeNavigationButtonColorToColor:(UIColor *)newColor 

Hoặc điều gì đó tương tự như dòng mã trên.

Bây giờ, hãy mở tệp triển khai đối tượng của bạn và triển khai phương pháp trên. Bất kỳ nơi nào trong tệp của bạn, hãy thêm phương thức sau:

- (void)changeNavigationButtonColorToColor:(UIColor *)newColor { 
    for (UIView *view in self.navigationController.navigationBar.subviews) { 
      NSLog(@"%@", [[view class] description]); 
      if ([[[view class] description] isEqualToString:@"UINavigationButton"]) { 
        [(UINavigationButton *)view setTintColor:newColor]; 
      } 
    } 
    } 

Như bạn có thể thấy ở trên, điều này thực sự dễ dàng hơn rất nhiều so với lần đầu tiên xuất hiện. Những gì chúng tôi làm đầu tiên là thiết lập vòng lặp for để lặp qua các bản xem con của UINavigationBar sử dụng NSFastEnumeration. Sau đó chúng tôi xuất tên lớp của khung nhìn con, để tham khảo trong tương lai. NẾU tên lớp là UINavigationButton, thì chúng ta đã có quan điểm của mình. Tất cả những gì chúng ta làm là thiết lập thuộc tính tintColor nếu UINavigationButton.

Vậy đó, chúng tôi đã hoàn tất!

Hoặc, nếu bạn muốn có phạm vi rộng hơn, tôi khuyên bạn nên tạo danh mục UINavigationBar mới và đặt phương pháp thay đổi màu nút ở đó. Đây là phương pháp của bạn có thể được thực hiện bởi bất kỳ lớp nào sử dụng UINavigationBar mà không phải tạo lại cùng một phương thức.

Hãy nhớ rằng, nút quay lại và nút điều hướng không giống nhau. Bạn sẽ phải tô màu nút quay lại một cách riêng biệt.

Và như thường lệ, đây là một liên kết đến một ứng dụng mẫu thể hiện mã này: NavButtonColor.zip

+0

Cảm ơn bạn rất nhiều !!!!! –

15

tôi tìm thấy giải pháp này thích hợp cho những người được liệt kê ở đây: Tint UIButton and UIBarButtonItem. Không giống như câu trả lời được chấp nhận, nó cho phép bạn thay đổi màu của UIBarButtonItems độc lập với UINavigationBar.

Trong trường hợp liên kết đi xuống trong tương lai, ý chính của nó là bạn tạo một UISegmentedControl có màu (với UISegmentedControlStyleBar) với một phân đoạn, sau đó tạo UIBarButtonItem sử dụng làm chế độ xem tùy chỉnh của nó.

Trong iOS 5, UIBarButtonItem có thuộc tính tintColor.

+2

Tuyệt vời! Tôi không hiểu tại sao điều này không được chọn làm câu trả lời vì phương pháp này cho phép bạn thay đổi nền của mục UIBarButton động hơn là chỉ khi tạo. Cảm ơn bạn đã chia sẻ điều này! – Stunner

+0

Điều này thật tuyệt vời! +1 –

+0

Tôi đã làm điều này và bây giờ nút không phản hồi lại hành động nữa ... Bất kỳ ý tưởng nào có thể được thực hiện? –

1

UIBarButtonItems vốn đã trả lời setTintColor, mặc dù đó không phải là API công khai.

Tôi có một tùy chỉnh UINavigationBar lớp con chạy khối này:

for (UIView *subview in self.subviews) { 
    if ([subview respondsToSelector:@selector(setTintColor:)]) { 
     [subview performSelector:@selector(setTintColor:) withObject:[UIColor redColor]]; 
    } 
} 

Rõ ràng thay [UIColor redColor] với màu sắc mà bạn chọn.

0

Có sẵn trong iOS 5.0 và sau đó cho UIBarButtonItem:

- (void)setBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics 

Nó có vẻ là giải pháp duy nhất hiện nay (IOS 9.0). tintColor hiện được sử dụng cho Màu Hình ảnh.

0

Swift3

UIBarButtonItem.appearance().tintColor = UIColor.green