2011-08-05 48 views
6

Tôi muốn tạo một công tắc tùy chỉnh cho ứng dụng của mình, trong đó tôi cung cấp ba hình ảnh cho các trạng thái có thể (bật, tắt, mousedown). Sự xuất hiện toàn bộ được chứa trong các hình ảnh, vì vậy tôi không muốn Cocoa để làm nổi bật (tối) các nút của chính nó trong thời gian mousedown.Tùy chỉnh NSButtonCell bằng hình ảnh và làm nổi bật

Hiện tại, tôi đã tạo một lớp con NSButtonCell, đã kéo một nút bevel của NSButtonTypeMomentaryChange vào khung nhìn của tôi và đặt tùy chỉnh loại lớp ô nút thành lớp con của tôi. Các lớp con chỉ thực hiện awakeFromNib để thử và thiết lập một số hành vi mong muốn:

- (void)awakeFromNib 
{ 
    [self setShowsStateBy:NSContentsCellMask]; 
    [self setHighlightsBy:NSContentsCellMask]; 
} 

mà tôi nghĩ (theo tài liệu) sẽ vô hiệu hóa các mousedown-tối của nút. Nó không.

Đây là nơi tôi đứng và bây giờ tôi có hai câu hỏi:

  • Làm thế nào tôi có thể thiết lập các lớp ButtonCell để chỉ hiển thị hình ảnh chuẩn bị của tôi trên mousedown và không tối/vẽ viền xung quanh nút?
  • Cách nào là cách sạch nhất/phù hợp nhất để thực hiện hành vi khác của nút chuyển, tức là hiển thị vị trí tắt/bật tùy thuộc vào trạng thái trước đó và có thể truyền đạt trạng thái của nó đúng cách tới các đối tượng khác?

Trả lời

5

Đặt loại nút của bạn thành Bật/Tắt. Phân lớp ô của nó. Viết hai phương thức sau:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView 
{ 
    if ([self state]) 
    { 
     [onStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 
    } 
    else 
    { 
     [offStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 
    } 
} 
- (void)highlight:(BOOL)flag withFrame:(NSRect)cellFrame inView:(NSView *)controlView 
{ 
    if (flag){ 
     [downStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 

    } 
} 
+0

Đó là, cảm ơn. – mss

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