如何在不修改其命中矩形的情况下调整UIButton的大小

时间:2013-04-08 15:00:35

标签: objective-c cocoa-touch cocoa uibutton

我有UIButton titleLabelbackgroundImage。我想在突出显示的状态下调整按钮的大小。此调整大小应该会影响titleLabelbackgroundImage,但我不想修改按钮的匹配区域。

目前我正在尝试这样做。它几乎可以工作,但它也会影响命中区域:

- (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。

1 个答案:

答案 0 :(得分:2)

正如您所正确观察到的那样,重写setHighlighted:以更改按钮的变换会导致一种恶性循环。所以不要这样做!相反,覆盖backgroundRectForBounds:,如下所示:

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

在突出显示期间放大按钮的绘制尺寸,但放大的图形仅可见,因为clipsToBounds为NO。边界保持不变,您只能在边界内触摸,因此触摸处理不受影响。

解决问题的背景图像部分。如果你真的坚持改变标题大小,我想你将不得不继续改变它的变换。相反,更改标题的字体(大小)会更少侵入,但我认为 - 如果这样可以用于您的目的。