2010-09-09 25 views
7

Tôi cần tạo nút tùy chỉnh thông qua mã, đây là cách tôi hiện đang thực hiện.Tạo Nút tùy chỉnh bằng UIBiew hoặc ghi đè UIButton?

-(void) initialiseButtons 
{ 
    int ypos = playerImage.frame.origin.y + playerImage.frame.size.height + 8; 
    for(int i=0; i<totalButtons; i++) 
    {  
     UIButton *newButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
     [newButton setFrame:CGRectMake(20, ypos, 220, 30)]; 
     newButton.tag = 10 + i; 
     [newButton addTarget:self action:@selector(statTapped:) forControlEvents:UIControlEventTouchUpInside]; 
     [self.frontView addSubview:newButton]; 
     ypos += 30 + 7; 
    } 
} 

Điều này tạo ra các nút trống hoàn hảo thông qua mã, cung cấp cho họ thẻ và gán chức năng gọi lại trên touchUpInside.

Nút tùy chỉnh cần có khả năng xử lý hiển thị hình ảnh khi nhấn xuống. Nó cần để có thể vẽ 2 phần văn bản. 1 liên kết với phía bên tay trái của nút và 1 căn chỉnh về phía bên phải của nút.

Sếp của tôi được đề xuất thay vì các nút tôi sử dụng Chế độ xem. Tôi không hiểu làm thế nào điều này sẽ làm việc. Khi tôi bắt đầu suy nghĩ về nó, tôi nghĩ rằng nó sẽ đòi hỏi phải có một viewcontroller dành riêng cho các nút. Và một số phương pháp vẽ? Nghe có vẻ phức tạp và tôi không hiểu làm thế nào nó có thể được thực hiện.

Có phương pháp đơn giản hơn bằng cách đặt UIButton ghi đè lớp tùy chỉnh không? Tôi đã thực hiện một lớp thử nghiệm đơn giản trước đó nhưng không có gì được rút ra trong các vị trí nút khi tôi sử dụng chúng ở vị trí của lớp UIButton bình thường. Tôi mong đợi tôi sẽ thấy buttonUp.png được vẽ.

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@interface CardButton : UIButton { 
} 
@end 


#import "CardButton.h" 
#import <UIKit/UIKit.h> 
@implementation CardButton 
- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     [self setImage:[UIImage imageNamed:@"buttonUp.png"] forStates:UIControlStateNormal]; 
     self.adjustsImageWhenHighlighted = YES; 
    } 
    return self; 
} 
@end 

Mọi người có thể cho tôi một số gợi ý về điều này? Tôi khá bị chặn vào lúc này. Đã đọc một số chủ đề khác liên quan đến các nút nhưng không có gì rõ ràng trong đầu tôi cách giải quyết vấn đề

Trả lời

2

Bạn không nên (tôi gần như không thể nói) subclass UIButton, là một nhóm lớp, và nó sẽ không thực tế (đọc: không thể) để lấy được từ đó.

Vì vậy, hai lựa chọn của bạn là:

1) Sử dụng tiêu chuẩn UIButton kiểu tùy chỉnh, thêm các yếu tố bạn muốn hiển thị (ví dụ UILabel) và treo lên hành động để liên lạc xuống và chạm lên và phản ứng phù hợp (thay đổi lượt xem, kích hoạt tác vụ, v.v.)

2) Sử dụng tùy chỉnh UIView, triển khai drawRect: để vẽ cách bạn thích hoặc sử dụng chế độ xem tùy chỉnh làm phụ đề như trong 1). Sau đó, sử dụng các thông báo touchesBegan:, touchesEnded: vv để phản ứng tương ứng (hoặc UIGestureRecognizer nếu bạn có thể sống với 3,2+ khả năng tương thích).

Bạn có thể xây dựng một nhà máy để tạo các nút đó nếu tất cả đều rất giống nhau, để mã của bạn trở nên sạch sẽ và không lặp lại.

Chỉnh sửa theo iOS 6: Apple hiện đề cập đến phân lớp trong tài liệu UIButton, vì vậy trong khi vẫn chưa được xác định rõ, có vẻ như khá an toàn để thực hiện việc này.

+0

CAnt tìm ra cách thực hiện việc này. Gonna để lại nó 24 giờ và xem nếu nó có ý nghĩa hơn khi tôi trở lại với nó. Cảm ơn sự giúp đỡ Eiko đánh giá cao của nó :) –

+0

Bạn có thể cung cấp thêm một số thông tin về điều này nhà máy? –

+0

@Lechazar Todorov Chỉ cần tạo phương thức lớp (tĩnh) * ở đâu đó * để tạo và cấu hình nút. Bằng cách đó bạn có thể tạo bao nhiêu nút của loại này theo ý muốn của bạn, nhưng không cần phải fiddle với subclassing nản lòng. – Eiko

1

Cách dễ dàng để thực hiện việc này là ghi đè UIView. Trong chế độ xem, bạn thêm UIButton làm Subview. Bằng cách này bạn có một lớp tái sử dụng mà không cần phải thực hiện lại hành vi nút.

Bạn có thể tạo kiểu cho nút theo cách bạn muốn trong phương thức initWithFrame của lớp có nguồn gốc UIView. Nếu bạn sử dụng lớp này làm mục tiêu cho các sự kiện nút, bạn có thể thực hiện hành vi đặc biệt dễ dàng, như hiển thị hình ảnh.

Đối với hai phần văn bản, bạn tạo hai nhãn và thêm chúng làm bản xem trước cho nút.

6

Cá nhân, tôi sẽ phân lớp UIButton. Mặc dù tất cả các cuộc nói chuyện mà bạn không thể phân lớp UIButton, Apple thậm chí nói về subclassing UIButton trong tài liệu UIButton.

Trong phân lớp, tôi sẽ tạo UIView với hai nhãn (hoặc hình ảnh hoặc bất kỳ thứ gì) và thêm chúng dưới dạng xem phụ vào nút (đảm bảo đặt tương tác cho văn bản và dạng xem là FALSE).

Điều tuyệt vời về điều này là nó thúc đẩy mã UIButton và giúp bạn không phát minh lại bánh xe.

+0

BTW, tài liệu cho UIButton thậm chí nói về phân lớp nó. Nó không phải là một nhóm lớp hoặc một đối tượng trừu tượng. Subclassing là hoàn toàn tốt đẹp. –

+0

Và chỉ là một FYI bởi vì Eiko mang nó lên, bạn không thể thay đổi buttonType lập trình - bạn chỉ có thể làm điều đó trong IB. Đây không phải là vấn đề đối với hầu hết các nhà phát triển. –

+0

UIButton KHÔNG phải là một cụm lớp. Tài liệu của Apple chỉ ra rõ ràng cụm lớp là gì (ví dụ NSArray là một nhóm lớp). Tôi sẽ dựa vào tài liệu của Apple chứ không phải tin đồn. –

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