2010-09-21 24 views
1

我爲我的應用程序創建了一個UIButton子類,我需要手動將titleLabel重新定位到按鈕高度的1/4左右。這個帖子; http://forums.macrumors.com/showthread.php?t=763140似乎直接解決相同的問題,並且解決方案很簡單,完全可以理解。然而,我沒有實現這一點,因爲我的重寫layoutSubviews永遠不會被調用。我的按鈕是靜態的,所以layoutSubviews只需要第一次調用,但它永遠不會。我的代碼:手動定位標題標籤在自定義UIButton中(使用layoutSubviews)

@interface MyButton : UIButton {} 

@implementation MyButton 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain]; 
    [[self layer] setCornerRadius:14.0f]; 
    [[self layer] setBorderWidth:3.0f]; 
    [[self layer] setMasksToBounds:YES]; 
    [self setBackgroundColor:[UIColor redColor]]; 
    [self setFrame:frame]; 
    return self; 
} 

- (void)layoutSubviews 
{ 
    NSLog(@"layout subs\n"); 
    [super layoutSubviews]; 
} 

@end 

移動標籤將是沒有問題的,但layoutSubviews永遠不會被調用。我也嘗試添加layoutIfNeeded,但它沒有任何區別。還有什麼更奇怪的是,我試圖直接從構造函數調用[self layoutSubviews],但layoutSubviews 仍然不叫!我開始認爲這可能是SDK 3.1.3中的一個bug。

任何人都可以幫忙嗎?!

回答

1

回答我自己的問題,似乎我是不正確的繼承。採取以下做法的結果layoutSubviews正確調用:

+ (id)buttonWithFrame:(CGRect)frame { 
    return [[[self alloc] initWithFrame:frame] autorelease]; 
} 

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) 
    { 
    ... 
    [self setFrame:frame]; 
    } 
    return self; 
} 

希望幫助別人

2

layoutSubviews,你可以做佈局更改的子視圖。確保裏面的方法:

呼叫[super layoutSubviews]

X不要更改值或self.frame這裏rect。如果你這樣做,它會遞歸地調用layoutSubviews

確保只改變其子視圖frame

From UIView Class Reference From Apple