2011-03-29 60 views
0

我有一个UIButton子类化。尝试构建一个复制AppStore“立即购买”按钮的类。我用3个CALayers创建按钮的样式。UIButton子类上的CALayer动画之后的触摸区域

当调整按钮使用:

[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是错误的选择?我在这里错过了什么?

回答

0

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

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

[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操作。