2009-11-02 34 views
12

Tôi có chế độ xem trong Ứng dụng của tôi có một số nút dựa trên số lượng mục được máy chủ trả về. Vì vậy, nếu máy chủ trả về nói 10 mục, cần có 10 nút và nhấp vào mỗi nút nên gọi một người khác.Tùy chỉnh UIButton cho Iphone

Vì mục đích trên, tôi đã tạo lớp nút tùy chỉnh xuất phát từ UIButton.

@implementation HopitalButton 

@synthesize index; 
@synthesize button_type; 

- (id)initWithFrame:(CGRect)frame { 

    if (self = [super initWithFrame:frame]) { 
     UIImage* img = [UIImage imageNamed:@"dr_btn.png"]; 
     [img stretchableImageWithLeftCapWidth:10 topCapHeight:10]; 
     [self setBackgroundImage:img forState:UIControlStateNormal]; 
     [self setTitleColor:[UIColor colorWithRed:0.698 green:0.118 blue:0.376 alpha:1] forState:UIControlStateNormal] ; 
     [self setFont:[UIFont fontWithName:@"Helvetica Bold" size:13]]; 
     self.titleLabel.textColor = [UIColor colorWithRed:178 green:48 blue:95 alpha:1]; 
     self.adjustsImageWhenHighlighted = YES; 
    } 
    return self; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 


@end 

Bây giờ vấn đề với mã trên là nó không tạo ra các nút trông tương tự như các nút được tạo mặc định trong Trình tạo giao diện. Đường viền bị thiếu.

Và tôi tạo các nút của các loại trên bằng đoạn mã sau:

HopitalButton* hb = [[HopitalButton alloc] init]; 
    hb.button_type = @"call"; 
    hb.frame = CGRectMake(50, 50 + i * 67, 220, 40); 
    [self.scroll_view addSubview:hb]; 
    [hb setTitle:[[[self.office_full_list objectAtIndex:i] objectForKey:@"Staff" ]objectForKey:@"FullName"] forState:UIControlStateNormal]; 
    hb.index = [NSNumber numberWithInt:[self.button_items count]]; 
    [self.button_items insertObject:hb atIndex:[self.button_items count]]; 
    [hb addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 

Tôi không tìm kiếm một cách để thiết lập các loại nút cho nút tùy chỉnh này. Có cách nào tôi có thể làm được không? Hoặc là có một cách tốt hơn để thiết kế mã.

Trả lời

27

Trước tiên, bạn bắt đầu với một hình ảnh căng ra với một biên giới:

alt text http://grab.by/4lP

Sau đó, bạn thực hiện một nút với hình ảnh kéo dài như nền và áp dụng văn bản.

INDEX_OFFSET = 82753; // random 

UIButton *sampleButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[sampleButton setFrame:CGRectMake(kLeftMargin, 10, self.view.bounds.size.width - kLeftMargin - kRightMargin, 52)]; 
[sampleButton setTitle:@"Button Title" forState:UIControlStateNormal]; 
[sampleButton setFont:[UIFont boldSystemFontOfSize:20]]; 
[sampleButton setTag:<INDEX>+INDEX_OFFSET]; 
[sampleButton setBackgroundImage:[[UIImage imageNamed:@"redButton.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal]; 
[sampleButton addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:sampleButton]; 

Rõ ràng, bạn sẽ cần phải điều chỉnh kích thước khung hình và kích thước cho phù hợp với ứng dụng của mình, cũng như mục tiêu, công cụ chọn và tiêu đề. Và

+0

Nhưng chỉ mục quan trọng đối với chương trình của tôi khi tôi sử dụng chỉ mục để tìm ra nút nào được nhấn vì có nhiều nút trong chế độ xem – Amal

+0

đặt thẻ cho nút. Tôi đã cập nhật mã số – coneybeare

+0

Bạn lấy hình ảnh nút màu đỏ có thể kéo ra ở đâu? – bentford

2

nên không được gọi initWithFrame: rect thay vì:

HopitalButton* hb = [[HopitalButton alloc] init]; 
6
[sampleButton setFont:[UIFont boldSystemFontOfSize:20]]; 

setFont hiện đang bị phản đối, sử dụng tài sản titleLabel.font thay

sampleButton.titleLabel.font = [UIFont boldSystemFontOfSize:20]; 
3

bạn có thể sử dụng lớp riêng lẻ cho tùy chỉnh Nút Roundrect có thể hữu ích trong toàn bộ dự án với kiểu khung cụ thể của bạn như bên dưới

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 
@interface CustomRoundRectButton : UIButton 
@end 


#import "CustomRoundRectButton.h" 
@implementation CustomRoundRectButton 
- (void)drawRect:(CGRect)rect 
{ 
[[self layer] setMasksToBounds:YES]; 
[self.layer setCornerRadius:10.0f]; 
[self.layer setBorderColor:[UIColor grayColor].CGColor]; 
[self.layer setBorderWidth:1.0]; 
} 
@end 

Trong này, bạn phải chọn loại nút tùy chỉnh và chọn lớp của nó là CustomRoundRectButton.

For Simple custom button we can use as below 

-(UIBarButtonItem*)BackButton 
{ 
UIButton*btn = [UIButton buttonWithType:UIButtonTypeCustom]; 
[btn setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal]; 
[btn setFrame:CGRectMake(0, 0, 30, 30)]; 
[btn addTarget:self action:@selector(actionBack) forControlEvents:UIControlEventTouchUpInside]; 
UIBarButtonItem*barBtn = [[[UIBarButtonItem alloc] initWithCustomView:btn] autorelease]; 
return barBtn; 
} 
Các vấn đề liên quan