2009-11-02 20 views
12

Mam widok w mojej aplikacji, który ma wiele przycisków na podstawie liczby elementów zwróconych przez serwer. Jeśli więc serwer zwróci 10 elementów, powinno być 10 przycisków i kliknięcie każdego przycisku powinno wywołać inną osobę.Niestandardowy UIButton dla Iphone

W powyższym celu utworzyłem niestandardową klasę przycisków wywodzącą się z 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 

Teraz problem z powyższym kodem polega na tym, że nie tworzy przycisków wyglądających podobnie do przycisków domyślnie utworzonych w narzędziu do tworzenia interfejsu. Brakuje granic.

I tworzyć przyciski powyższego typu według następującego kodu:

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

nie jestem znalezienie sposobu, aby ustawić typ przycisku dla tego niestandardowego przycisku. Czy mogę to zrobić? Czy istnieje lepszy sposób na zaprojektowanie kodu.

Odpowiedz

27

pierwszym uruchomieniu z rozciągliwego obrazu z obramowaniem:

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

Następnie zrobić przycisk z obrazem rozciągniętym w tle i zastosować tekst.

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

Oczywiście, trzeba będzie dostosować pochodzenie i rozmiar ramki pasujące swoją aplikację, a także cel, wyboru, a tytuł. I

+0

Ale indeks jest ważne dla mojego programu, jak korzystać z indeksu, aby dowiedzieć się, który przycisk został naciśnięty, ponieważ istnieje więcej niż jeden przycisk w widoku – Amal

+0

ustawić znacznik do przycisku. Zaktualizowałem kod – coneybeare

+0

Skąd wziął się obraz rozciągliwego czerwonego przycisku? – bentford

2

nie powinno być wywołanie initWithFrame: rect zamiast:

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

setFont jest teraz przestarzała, użyj własności titleLabel.font zamiast

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

można wykorzystywać indywidualną dla klasy zwyczaju Okrągły przycisk, który może być przydatny w całym projekcie z konkretnym stylem ramki, jak poniżej:

#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 

W tym przypadku należy wybrać niestandardowy typ przycisku i wybrać jego klasę jako 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; 
} 
Powiązane problemy