2009-10-13 36 views
5

Làm thế nào tôi có thể nhận được một nút hình chữ nhật không?Nút iPhone có hình dạng không phải hình chữ nhật?

Ví dụ: tôi có ảnh PNG có độ trong suốt alpha. Làm cách nào để đặt hình dạng của nút thành hình ảnh này mà không có màu trong suốt.

+0

tin chi tiết về chính xác những gì nó bạn đang tìm kiếm để đạt được có thể giúp bạn có được nơi bạn muốn đi nhanh hơn. – fbrereto

Trả lời

8

Giống như những người khác nói rằng bạn nên có một bề mặt thích hợp để đăng ký các sự kiện liên lạc, nhưng tôi chắc chắn rằng bạn biết điều đó và có lý do của bạn vì vậy tôi sẽ chỉ cho bạn biết làm thế nào tôi đã làm nó:

tôi cần làm điều này cách đây không lâu và những gì tôi đã làm là những gì Sixten Otto vừa gợi ý. Có một số gợi ý trong câu hỏi ban đầu của tôi ("UPDATE" phần) để nhận được giá trị alpha cho hình ảnh của bạn tại một điểm nhất định:

How to create a transparent window with non-rectangular buttons?

Edit: Tôi đề nghị subclassing UIControl trong ví dụ dưới đây nhưng nếu bạn không cần bất kỳ hành vi đặc biệt nào trên nút của bạn ngoài "không phải hình chữ nhật" của nó, sau đó chỉ phân lớp UIButton không biên giới được thiết lập với PNG của bạn sẽ thực hiện công việc và yêu cầu ít công việc hơn. Bạn có nhiều quyền kiểm soát hơn đối với hành vi của kiểm soát bằng cách phân lớp UIControl và thực hiện nó theo cách "cứng".

Tôi khuyên bạn nên phân lớp UIControl và ghi đè phương thức sự kiện chạm, sau đó kiểm tra alpha dưới điểm được nhấn và không xử lý sự kiện nếu alpha == 0.Đối với bản vẽ bạn ghi đè drawRect: và sử dụng phương thức của NSImage trong đó để vẽ hình ảnh của bạn trong khung của điều khiển.

Trước tiên, bạn cần phải tải hình ảnh và có được một đại diện bitmap của nó:

buttonImage = [NSImage imageNamed:@"myButtonImage"]; 
buttonImageRep = [[buttonImage representations] objectAtIndex:0]; 

Sau đó, bạn có thể vẽ nó vào quan điểm của kiểm soát: (nơi stateImage là một con trỏ đến hình ảnh mà phải được rút ra tùy nếu nút đó được nhấn hay không)

- (void)drawRect:(NSRect)aRect { 
[stateImage drawInRect:[self bounds] fromRect:NSMakeRect(0.0,0.0,[buttonImage size].width,[buttonImage size].height) 
     operation:NSCompositeSourceOver fraction:1.0]; 
} 

Tại thời điểm này bạn đã vẽ nút bằng hình ảnh png của bạn. Bạn có thể ghi đè phương thức sự kiện chạm và xử lý sự kiện nếu alpha không phải là 0:

NSColor *colorUnderMouse = [buttonImageRep colorAtX:mouse.x y:mouse.y]; 
float alpha = [colorUnderMouse alphaComponent]; 

Đó là những gì tôi đã làm và nó hoạt động tuyệt vời. Hi vọng điêu nay co ich!

N.B: Ví dụ của tôi dành cho máy Mac nhưng cũng sẽ hoạt động trên iPhone, có thể với một số sửa đổi nhỏ.

5

nút hình chữ nhật là một loại nút, bạn có thể sử dụng các loại nút tùy chỉnh và gán một hình ảnh để thoát khỏi các cạnh hình chữ nhật của nút ... heres một tham chiếu đến các loại nút http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html#//apple_ref/doc/c_ref/UIButtonType và UIButton http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html

7

Có vẻ như bạn đang tìm kiếm vùng có thể nhấp của nút khớp chính xác với PNG bạn đang sử dụng.

Nếu đó là những gì bạn đang tìm kiếm, trước tiên tôi sẽ nói không làm điều đó. IPhone được nhấn bằng ngón tay, thường không có độ chính xác để phân biệt một vùng nhỏ như vậy. Tuy nhiên, nếu bạn bị kẹt trong ý tưởng, thì giải pháp là không sử dụng nút, thay vào đó, hãy xử lý nhấp chuột trong khung chính và giải thích giá trị X/Y theo cách thủ công của nhấp chuột để xác định xem nó có nằm trong một số khu vực giới hạn (Trong trường hợp của một nút cạnh tròn, có thể sẽ bao gồm hoặc kết quả kiểm tra 4 vòng tròn và 2 hình chữ nhật)

Chỉnh sửa: Nhận ra một phần câu hỏi ban đầu của bạn, tôi nhận thấy bạn đã đề cập bạn muốn xử lý chức năng tự động dựa trên kênh Alpha. Trong khi tôi muốn giới thiệu phương pháp của tôi về các vùng giới hạn, bạn có thể lý thuyết thực hiện điều này bằng cách lấy mẫu PNG để kiểm tra kênh Alpha tại một giá trị được bù đắp bởi gốc của nút. Thậm chí có khả năng làm điều này trong sự kiện nhấp chuột của nút bình thường.

2

Guvante says, thực sự không phải là ý tưởng hay khi dựa vào các chạm chính xác. Apple, ví dụ, đề nghị rằng controls be at least 44px across.

Tôi khuyên bạn nên sử dụng UIButton loại UIButtonTypeCustom, đặt hình ảnh của nút thành PNG của bạn và đăng ký sự kiện chạm (see here for more on event handling). Sau đó, trong phương pháp hành động của bạn, bạn có thể nhận được tọa độ chạm của sự kiện và kiểm tra các tọa độ đó đối với alpha của hình ảnh của bạn để xem liệu bạn có nên coi đó là một liên lạc "thực sự" hay không.

1

Tùy chọn khác có thể là chia nút của bạn thành nhiều phần hình chữ nhật.

1

@Form đúng về cách sử dụng 'drawRect' để triển khai hình dạng tùy chỉnh cho nút.

Nhưng tốt hơn method để thi liên lạc bên trong hay không nút bên đang sử dụng của

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; 

Bạn có thể tạo nút của bạn trong suốt cho chạm ở một số bộ phận.

Nếu bạn không thể sử dụng hình ảnh tùy chỉnh cho nút (ví dụ nếu bạn vẽ văn bản trên nút), bạn có thể sử dụng mới method để vẽ subviews hệ thống cấp bậc thành một hình ảnh:

- (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates; 
Các vấn đề liên quan