0

我有一个UIButtonwith atitleLabel和 a backgroundImage。我想在按钮处于突出显示状态时调整其大小。这个调整大小应该会影响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 属性,但这也会导致点击区域发生变化。

如果可能的话,我想避免为突出显示的状态设置不同的背景图像。

4

1 回答 1

2

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

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

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

这解决了问题的背景图像部分。如果您真的坚持要更改标题大小,我想您将不得不继续更改其变换。不过,我认为更改标题的字体(大小)的侵入性会更小——如果这对您的目的有用的话。

于 2013-04-08T15:21:13.453 回答