我有UIButton
titleLabel
和backgroundImage
。我想在突出显示的状态下调整按钮的大小。此调整大小应该会影响titleLabel
和backgroundImage
,但我不想修改按钮的匹配区域。
目前我正在尝试这样做。它几乎可以工作,但它也会影响命中区域:
- (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 :(得分:2)
正如您所正确观察到的那样,重写setHighlighted:
以更改按钮的变换会导致一种恶性循环。所以不要这样做!相反,覆盖backgroundRectForBounds:
,如下所示:
- (CGRect)backgroundRectForBounds:(CGRect)bounds {
CGRect result = [super backgroundRectForBounds:bounds];
if (self.highlighted)
result = CGRectInset(result, -3, -3);
return result;
}
在突出显示期间放大按钮的绘制尺寸,但放大的图形仅可见,因为clipsToBounds
为NO。边界保持不变,您只能在边界内触摸,因此触摸处理不受影响。
解决问题的背景图像部分。如果你真的坚持改变标题大小,我想你将不得不继续改变它的变换。相反,更改标题的字体(大小)会更少侵入,但我认为 - 如果这样可以用于您的目的。