2013-04-08 81 views
0

我有一個UIButtontitleLabelbackgroundImage。我想在突出顯示狀態下調整按鈕的大小。這個調整大小應該會影響titleLabelbackgroundImage,但我不想修改按鈕的點擊區域。如何調整UIButton而不修改它的熱門矩形

目前我正在嘗試這樣。它幾乎工作,但它也影響了災區:

- (void)setHighlighted:(BOOL)highlighted 
{ 
    if (highlighted && !self.highlighted) 
    { 
     self.transform = CGAffineTransformMakeScale(scaleFactorOnTouch, scaleFactorOnTouch); 
    } 
    else if (!highlighted && self.highlighted) 
    { 
     self.transform = CGAffineTransformMakeScale(1.0, 1.0); 
    } 
    [super setHighlighted:highlighted]; 
} 

這導致當你觸摸它(100個像素擴展)災區外的按鈕,拖動裏面,還有當你拖動的這回旋/震顫延長命中區域邊緣。擺動是因爲hitArea在高亮狀態和非高亮狀態之間不斷變化。

我也嘗試修改self.layer.transform屬性,但這也會導致命中區域的更改。

如果可能,我想避免爲突出顯示的狀態設置不同的backgroundImage。

+0

爲什麼你的兩個條件不相互對立?首先,你設置'self.titleLabel'的變換。相反,你重置'self'的變換。你當然不是這個意思嗎?你應該設置和重置同一事物的變換,是的? – matt 2013-04-08 15:05:53

+0

對不起,這是爲了讀兩個'self.transform'。我編輯了這個問題來反映這一點。它顯示'self.titleLabel.transform',因爲我試圖手動調整'titleLabel'和'backgroundImage'的大小,但是我找不到調整'backgroundImage'的方法(UIBUtton的backgroundImage似乎只是將按鈕大小)。 – 2013-04-08 15:08:14

回答

2

正如你所看到的,重寫setHighlighted:來改變按鈕的轉換會導致一種惡性循環。所以不要那樣做!相反,覆蓋backgroundRectForBounds:,像這樣:

- (CGRect)backgroundRectForBounds:(CGRect)bounds { 
    CGRect result = [super backgroundRectForBounds:bounds]; 
    if (self.highlighted) 
     result = CGRectInset(result, -3, -3); 
    return result; 
} 

這凸顯期間擴大了按鈕的繪製大小,但放大圖僅僅是可見的,因爲clipsToBounds是NO。邊界保持不變,只能在邊界內觸摸,因此觸摸處理不受影響。

解決了問題的背景圖像部分。如果你真的堅持改變標題大小,我想你必須繼續改變它的轉換。如果改變標題的字體(大小),我認爲 - 如果這樣可以達到你的目的,那麼侵入性就會小一些。

+0

謝謝!我認爲這會做。在接受答案之前的最後一個問題是:文檔聲明contentEdgeInsets屬性應該調整按鈕內容的大小,所以我認爲這可能是實現我想要的替代方案。但是,當我做'self.contentEdgeInsets = UIEdgeInsetsMake(2,2,2,2)'我的按鈕保持不變。爲什麼? – 2013-04-08 15:32:41