2013-04-12 40 views
28

Tôi có một tùy chỉnh UIButton là một tệp .png màu đen và trắng trong suốt, không có trạng thái dừng, chỉ một hình ảnh. Khi khai thác và giữ ngón tay trên nó, nó chuyển sang màu xám đậm. Tôi đang cố thay đổi màu xám đen đó thành thứ gì đó ít áp bức hơn một chút. Nút được mở trong chế độ xem trong chế độ xem, không phải trong thanh tab, thanh công cụ hoặc bộ điều khiển điều hướng.Thay đổi màu của vùng sáng màu xám đậm khi giữ nút UIButton tùy chỉnh?

Tôi đã thử cài đặt tintColor (tài liệu hướng dẫn thông báo một cách hữu ích cho tôi chỉ phù hợp với các loại nút 'một số', không có chỉ báo nào).

Tôi cũng đã thử thay đổi mọi thứ tôi có thể tìm thấy trong Trình tạo giao diện liên quan đến làm nổi bật màu sắc, trạng thái mặc định, v.v. Không có gì tạo nên sự khác biệt.

Tôi thậm chí đã thử đặt hình ảnh của nút cho trạng thái UIControlStateHighlighted của nó, nhưng ngay cả điều này cũng khiến lớp phủ màu xám tối xuất hiện khi tôi giữ ngón tay trên nó.

Làm cách nào để thay đổi màu đó? Tôi đã xem xét nhiều vấn đề khác ở đây trên SO và đã không thể tìm thấy một giải pháp phù hợp với tôi. Mọi sự trợ giúp sẽ rất được trân trọng!

EDIT: tôi giải quyết vấn đề bằng cách sử dụng loại UIImage có thêm một phương pháp có sử dụng CoreGraphics để áp dụng một màu cho một cung cấp UIImage. Sau đó tôi đặt hình ảnh đó làm điểm nổi bật và tất cả đều tốt. Có vẻ rất nhiều hoop-la để thay đổi một màu sắc Apple nên đã cho chúng tôi thay đổi, nhưng c'est la vie.

Trả lời

55

Bạn đã nói rằng bạn đặt hình ảnh tùy chỉnh cho trạng thái UIControlStateHighlighted. Điều này nên tắt hành vi mặc định.

Nếu bạn vẫn gặp sự cố, bạn có thể tắt hiệu ứng này bằng cách đặt thuộc tính adjustsImageWhenHighlighted thành NO và sử dụng bất kỳ hiệu ứng tùy chỉnh nào bạn muốn.

+0

Cảm ơn. Sẽ chấp nhận trong 10 phút khi nó cho phép tôi .. – Luke

+0

Tôi vừa chỉnh sửa: thiết lập một hình ảnh tùy chỉnh cho 'UIControlStateHighlighted' thực sự sẽ hoạt động. Tôi sẽ thử điều này một lần nữa và chắc chắn rằng bạn đã không phạm sai lầm. –

+0

Tôi nghĩ rằng nó thiết lập nó nhưng không kéo dài nó đúng cách, tôi đang làm một số công cụ với thay đổi kích thước hình ảnh dựa trên văn bản bên trong nó. Nó cho thấy màu trắng ở giữa, nhưng màu xám đậm xung quanh bên ngoài, do đó, đoán hình ảnh không lấp đầy không gian của bản gốc. Đó là kỳ lạ, vì tôi đang thiết lập nó cho chính nó. – Luke

1

Tôi gặp sự cố tương tự với UIButton tùy chỉnh khi nút được tô sáng bằng màu xám mỗi khi được nhấn. Tôi giải quyết vấn đề đó bằng cách subclassing UIButton và trong việc thực hiện Tôi overrode một phương pháp duy nhất, (void) setHighlighted: Phương pháp và giữ nó rỗng:

- (void)setHighlighted:(BOOL)highlighted 
{ 
    // Leave empty to prevent super from doing whatever 
    // that it is doing to show the grey highlight. 
} 

Đó dừng lại bất kỳ loại làm nổi bật như tôi đã không làm bất cứ điều gì trong phương pháp . Đó là một cách tiếp cận tốt hơn nếu tất cả những gì bạn đang cố gắng làm là loại bỏ bất kỳ hiệu ứng làm nổi bật nào.

Vì vậy, trong mã của bạn, tạo một lớp con của UIButton, ghi đè lên phương thức setHighlighted, và sau đó làm cho nút tùy chỉnh của bạn là một lớp con của lớp tùy chỉnh này.

+0

Có lẽ siêu cũng đang làm nhiều hơn là chỉ rối tung với sự thay đổi màu sắc mặc dù. Sẽ cảnh giác với việc này. – Yavin4

29

Nếu điều chỉnhImageWhenHighlighted = NO không hoạt động, đặt Loại nút thành Tùy chỉnh (IB hoặc theo lập trình).

Loại nút mặc định: Hệ thống, hành vi thay đổi của nút được đánh dấu.

+0

Không biết làm thế nào tôi bỏ lỡ điều đó. Cảm ơn. –

+0

Bạn đã cứu mạng tôi. Kiểu mặc định của Interface Builder cho UIButton là 'system'. Thật kỳ lạ, uh? –

3

Swift 3:

myButton.adjustsImageWhenHighlighted = false 
0

Bạn có thể viết một nút tùy chỉnh nào đó

class ActionButton: UIButton { 

    var originalBackgroundColor: UIColor! 

    override var backgroundColor: UIColor? { 
    didSet { 
     if originalBackgroundColor == nil { 
     originalBackgroundColor = backgroundColor 
     } 
    } 
    } 

    override var isHighlighted: Bool { 
    didSet { 
     guard let originalBackgroundColor = originalBackgroundColor else { 
     return 
     } 

     backgroundColor = isHighlighted ? originalBackgroundColor.darken() : originalBackgroundColor 
    } 
    } 
Các vấn đề liên quan