在UIButton子类上的CALayer动画之后触摸区域

时间:2011-03-29 05:40:58

标签: iphone ipad core-animation

我有一个UIButton我是子类。尝试构建一个复制AppStore“立即购买”按钮的类。我用3个CALayers创建了按钮的样式。

调整按钮大小时,我使用:

[CATransaction begin];
[CATransaction setAnimationDuration:0.25];

CGSize size = [self.titleLabel.text sizeWithFont:[UIFont boldSystemFontOfSize:18]];
size.width = size.width + kPadding;

for(CALayer *la in self.layer.sublayers){       
    CGRect boundsRect = la.frame;
    float inset = boundsRect.size.width - size.width;       
    boundsRect.origin.x = boundsRect.origin.x+inset;
    boundsRect.size.width = size.width;
    la.frame = boundsRect;  
    [la layoutIfNeeded];
}

[CATransaction commit];

这种表现非常好,看起来很棒,但按钮的触控区域与按钮的原始尺寸保持一致。任何修改按钮或主CALayer的框架\边界的尝试都会导致奇怪的行为,并且触摸区域似乎仍然不正确。

我也用CABasicAnimation动画颜色变化。使用CALayer是错误的选择吗?我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

相当简单的解决方案。由于您要偏移图层以使动画沿特定方向前进,因此按钮的框架不再与图层匹配。

为了解决这个问题, CALayer动画之后,我调整大小并偏移UIButton帧,然后将CALayer帧偏移回UIButton帧中它们所属的位置。这是通过在setCompletionBlock上使用CATransaction来实现的。

[CATransaction setCompletionBlock:^{
    //Readjust button frame for touch area

    CGRect frameRect = self.frame;
    frameRect.origin.x = frameRect.origin.x - offset;
    frameRect.size.width = frameRect.size.width + offset;
    self.frame = frameRect;

    [CATransaction setDisableActions:YES];
    for(CALayer *layer in self.layer.sublayers){
        CGRect rect = layer.frame;
        rect.origin.x = rect.origin.x+offset;
        layer.frame = rect;
    }
    [CATransaction commit];

}];

请注意,CALayers具有隐式动画,因此您必须在嵌套的CATransaction中禁用CALayer操作。