UIButton (w/image) 在应用基于旋转的 CGAffineTransform 后对设备方向做出奇怪的反应
Posted
技术标签:
【中文标题】UIButton (w/image) 在应用基于旋转的 CGAffineTransform 后对设备方向做出奇怪的反应【英文标题】:UIButton (w/image) reacts strangely to device orientation after applying rotation-based CGAffineTransform 【发布时间】:2012-09-10 14:25:14 【问题描述】:所以,我有一个 UIButton(由一个图像组成),当我点击它时应用 CGAffineTransform 以突出显示它所处的状态:
- (void)animateMasterAddButton
CGAffineTransform buttonTransform;
// Button state hasn't been changed at this point, so selected == NO applies to when the button is *about* to be selected
if(self.masterAddButton.selected == NO)
CGAffineTransform buttonRotationTransform = CGAffineTransformMakeRotation((135.0 * M_PI) / 180);
buttonTransform = CGAffineTransformConcat(CGAffineTransformIdentity, buttonRotationTransform);
else
buttonTransform = CGAffineTransformIdentity;
[UIView animateWithDuration: 0.3
animations: ^
self.masterAddButton.transform = buttonTransform;
];
如果我将设备保持在相同的方向,这可以正常工作。然而,一旦我转动设备,UIButton 就会消失,但只有当 UIButton 被选中时(即,只有当旋转变换生效时)。我在视图控制器的willRotateToInterfaceOrientation:duration:
方法中记录了按钮的框架和边界,结果如下:
在未选择按钮的情况下旋转设备:
帧:8, 8, 57, 57 界限:0, 0, 57, 57(这些是正确的值)
选择按钮旋转设备:
帧:-4, -4, 80, 80 边界:0, 0, 0, 113.137
在第二组结果中,框架是正确的,因为旋转后的图像有它的角,所以会占用更多的空间。然而,界限表明有些事情是古怪的。我猜由于边界宽度为零,按钮在那里但太窄而无法呈现。
谁能告诉我为什么会这样,我该如何解决?
【问题讨论】:
如果您使用 CGAffineTransformConcat(self.masterAddButton.transform, buttonRotationTransform) 而不是使用身份转换,会有什么不同吗? 不,那里的结果完全相同。 【参考方案1】:搞定了,有点侧身思考。基本上,一旦旋转动画完成,转换后的按钮图像将替换为与动画应用旋转量相同的版本(我编写了一个 UIImage 类别方法来执行此过程)。然后使用CGAffineTransformIdentity
禁用按钮上的转换。由于设备旋转时按钮上不存在任何变换,因此它保持不变:-)
代码如下:
- (void)animateMasterAddButton
CGFloat addButtonRotationAngle = AddButtonRotationAngle * -1.0; // AddButtonRotationAngle is a const float defined at the top of .m file
CGAffineTransform buttonTransform;
UIImage *rotatedAddButtonImage = [UIImage imageNamed: @"Add button"];
if(self.masterAddButton.selected == NO)
addButtonRotationAngle = AddButtonRotationAngle;
rotatedAddButtonImage = [UIImage rotatedImageFromImage: rotatedAddButtonImage withAngle: (addButtonRotationAngle * M_PI) / 180];
// rotatedImageFromImage:withAngle: is a self-written category method on UIImage
CGAffineTransform buttonRotationTransform = CGAffineTransformMakeRotation((addButtonRotationAngle * M_PI) / 180);
buttonTransform = CGAffineTransformConcat(CGAffineTransformIdentity, buttonRotationTransform);
[UIView animateWithDuration: 0.3
animations: ^
self.masterAddButton.transform = buttonTransform;
completion: ^(BOOL finished)
[self.masterAddButton setImage: rotatedAddButtonImage forState: UIControlStateNormal];
self.masterAddButton.transform = CGAffineTransformIdentity;
];
【讨论】:
以上是关于UIButton (w/image) 在应用基于旋转的 CGAffineTransform 后对设备方向做出奇怪的反应的主要内容,如果未能解决你的问题,请参考以下文章