2010-04-01 31 views
10

Tôi muốn có thể tạo UIButton với vùng phản hồi quá khổ. Tôi biết rằng một cách để làm điều đó là ghi đè lên phương thức hitTest trong một lớp con, nhưng làm thế nào để tôi nhanh chóng khởi tạo đối tượng nút tùy chỉnh của tôi ở vị trí đầu tiên?iPhone: Ghi đè nút UIButtonWithType để trả về lớp con

[OversizedButton buttonWithType: UIButtonTypeDetailDisclosure]; 

không hoạt động ngoài hộp vì nútWithType trả về UIButton, không phải nút quá khổ.

Vì vậy, có vẻ như tôi cũng cần phải ghi đè phương thức buttonWithType. Có ai biết cách để làm điều này không?

@implementation OversizedButton 

+ (id)buttonWithType:(UIButtonType)buttonType 
{ 
    // Construct and return an OversizedButton rather than a UIButton 
    // Needs to handle special types such as UIButtonTypeDetailDisclosure 
    // I NEED TO KNOW HOW TO DO THIS PART 
} 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    // Return results if touch event was in oversized region 
    // I ALREADY KNOW HOW TO DO THIS PART 
} 

@end 

Hoặc, có thể tôi có thể tạo nút bằng cách sử dụng alloc/initWithFrame. Nhưng thuộc tính buttonType là chỉ đọc, vậy làm cách nào để bạn tạo các loại nút tùy chỉnh?

Lưu ý: Tôi biết có nhiều cách khác để thực hiện việc này, chẳng hạn như có nút ẩn đằng sau nút hiển thị. Tôi không quan tâm đến cách tiếp cận đó và muốn tránh nó. Bất kỳ trợ giúp nào về cách tiếp cận được mô tả ở trên sẽ rất hữu ích. Cảm ơn

Trả lời

0

Tài sản buttonType không được sử dụng ở bất kỳ đâu trong UIKit và trong mã của bạn, bạn luôn có thể kiểm tra -isKindOfClass:, vì vậy ghi đè +buttonWithType: cho thuộc tính này là IMO vô nghĩa. Chỉ cần sử dụng

return [[[OversizedButton alloc] initWithFrame:...] autorelease]; 

(Bạn có thể ghi đè lên các loại nút bằng phương pháp không có giấy tờ _setButtonType:.)

+7

Bạn có nghiêm túc đề xuất rằng tôi sử dụng một phương pháp không có giấy tờ trong một ứng dụng thương mại sẽ yêu cầu sự chấp thuận của Apple không? – Amagrammer

+0

@Ama: Tôi đề nghị bạn không bận tâm với thuộc tính 'buttonType'. Nhưng nếu bạn phải, cách duy nhất để thay đổi nó là thông qua các phương pháp không có giấy tờ. – kennytm

+1

Vâng, tôi cần hiển thị các nút UIButtonTypeDetailDisclosure, vì vậy "không làm phiền" sẽ không hoạt động. Tôi có nên giả định rằng với kiến ​​thức của bạn không có cách nào để ghi đè lên phương thức buttonWithType? Cảm ơn – Amagrammer

3

UIButton buttonWithType: trả về một UIButton hoặc một UIRoundedRectButton, tùy thuộc vào giá trị của tham số type.

UIButton không cung cấp phương thức initWithType:, tôi tin rằng sẽ rất nguy hiểm khi thử và ghi đè buttonWithType:.

Thay vào đó, tôi đề nghị bạn chọn lớp con UIControl. Sau đó, bạn có thể thêm nút dưới dạng chế độ xem con vào kiểm soát của mình và chặn hitTest:withEvent:.

+4

Tôi đang thử nghiệm với điều đó bởi vì nó xuất hiện khác là không thực tế. Mặc dù nó có vẻ không phù hợp khủng khiếp. Cảm ơn. – Amagrammer

1

Đây là cách tôi làm điều đó:

+ (instancetype)customButtonWithCustomArgument:(id)customValue { 
    XYZCustomButtom *customButton = [super buttonWithType:UIButtonTypeSystem]; 
    customButton.customProperty = customValue; 
    [customButton customFunctionality]; 
    return customButton; 
} 

trình cũng với các loại khác, UIButtonTypeSystem chỉ là một ví dụ.

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