12

サーバーから返されたアイテムの数に基づいたボタンの数を持つアプリのビューがあります。したがって、サーバーが 10 個のアイテムを返した場合、10 個のボタンがあり、各ボタンをクリックすると別の人が呼び出されます。

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

このカスタム ボタンのボタン タイプを設定する方法が見つかりません。私ができる方法はありますか?または、コードを設計するためのより良い方法があります。

4

4 に答える 4

27

最初に、境界線のある伸縮可能な画像から始めます。

代替テキスト http://grab.by/4lP

次に、引き伸ばされた画像を背景としてボタンを作成し、テキストを適用します。

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

明らかに、フレームの原点とサイズをアプリに合わせて調整する必要があります。また、ターゲット、セレクター、タイトルも調整する必要があります。と

于 2009-11-02T19:22:59.873 に答える
6
[sampleButton setFont:[UIFont boldSystemFontOfSize:20]]; 

setFont is now deprecated, use titleLabel.font property instead

sampleButton.titleLabel.font = [UIFont boldSystemFontOfSize:20];
于 2010-06-06T09:33:07.667 に答える
3

以下のように、特定のフレーム スタイルを持つプロジェクト全体で役立つカスタム Roundrect ボタンに個々のクラスを使用できます。

#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

この場合、ボタン タイプ custom を選択し、そのクラスを 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;
}
于 2012-10-20T06:11:54.213 に答える
2

initWithFrame: rect次の代わりに呼び出してはいけません:

    HopitalButton* hb = [[HopitalButton alloc] init];
于 2009-11-02T19:25:06.617 に答える