我有一个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是错误的选择吗?我在这里缺少什么?
答案 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操作。