UIView轮换不能发生两次

时间:2012-08-27 14:10:46

标签: iphone ios rotation core-graphics

在我的UITableViewCell中,我有UIImageView,我希望每次用户点击该行时旋转180°(didSelectRowAtIndexPath :)。代码非常简单:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
     UITableViewCell *curCell = [self.tableView cellForRowAtIndexPath:indexPath];
     UIImageView *imgArrow = (UIImageView*)[curCell viewWithTag:3];
     [UIView animateWithDuration:0.3 animations:^{imgArrow.transform = CGAffineTransformMakeRotation(M_PI);}];
 }

问题是这总是只发生一次 - 用户第一次点击单元格时,imgArrow正确旋转,但是当第二次单击单元格时它不会旋转回来。为什么呢?

感谢您的帮助!

2 个答案:

答案 0 :(得分:9)

问题是视图变换属性旋转到视图原始变换指定的程度。因此,一旦您的按钮旋转180度,再次调用此按钮将无效,因为它将尝试从当前位置(180)旋转到180度。

这就是说,你需要创建一个if语句来检查转换。如果是180,则旋转为“0”,反之亦然。

实现此目标的一种简单方法是使用BOOL

if (shouldRotate){
     [UIView animateWithDuration:0.3 animations:^{imgArrow.transform = CGAffineTransformMakeRotation(M_PI);}];
     shouldRotate = NO;
}else{
     [UIView animateWithDuration:0.3 animations:^{imgArrow.transform = CGAffineTransformMakeRotation(0);}];
     shouldRotate = YES;
}

答案 1 :(得分:1)

您只是设置转换。要应用多个转换,必须将imgArrow.transform转换矩阵乘以所需的新转换。您可以使用CGAffineTransformConcat()执行此操作。

CGAffineTransform currTransform = [imgArrow transform];
CGAffineTransform newTransform = CGAffineTransformConcat(currTransform, CGAffineTransformMakeRotation(M_PI));
[imgArrow setTransform:newTransform];