2009-11-02 13 views
12

私のアプリケーションには、サーバーから返されたアイテムの数に基づいていくつかのボタンがあります。したがって、サーバーが10個のアイテムを返す場合、10個のボタンがあり、各ボタンをクリックすると別の人が呼び出されるはずです。iPhone用のカスタムUIButton

上記の目的のために、私は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 

上記のコードの問題は、Interface Builderでデフォルトで作成されたボタンに似たボタンを作成しないことです。ボーダーがありません。私はこのカスタムボタンのボタンの種類を設定する方法を見つけることではないのです

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]; 

そして私は次のコードで上記のタイプのボタンを作成します。 私はそれを行う方法はありますか?あるいは、コードを設計するより良い方法があります。そして、あなたが背景として、延伸画像でボタンを作成し、テキストを適用

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

答えて

27

あなたは最初のボーダーと伸縮性の画像で始まります。

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]; 

明らかに、フレームの起点とサイズを、アプリケーション、ターゲット、セレクタ、およびタイトルに合わせて調整する必要があります。そして

+0

しかし、ビュー – Amal

+0

に複数のボタンがボタンにタグを設定してあるので、私が押されたボタンを見つけるためにインデックスを使用してインデックスが私のプログラムのために重要です。コードを更新しました – coneybeare

+0

伸縮性のある赤いボタン画像はどこで手に入りましたか? – bentford

2

あなたがinitWithFrame: rectを呼び出す代わりにすべきではありません:

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

のsetFontが廃止され、代わりにtitleLabel.fontプロパティを使用

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

カスタムのために、個々のクラスを使用することができますあなたの特定のフレームスタイルで以下のようにプロジェクト全体で便利な丸いボタン

#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 

この場合、カスタムのボタンタイプを選択し、そのクラスを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; 
} 
関連する問題