如何调整UIButton而不修改它的热门矩形

如何调整UIButton而不修改它的热门矩形

问题描述:

我有一个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

正如你所看到的,重写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