超级视图旋转后UIButton没有收到触摸

Posted

技术标签:

【中文标题】超级视图旋转后UIButton没有收到触摸【英文标题】:UIButton not receiving touch after superview rotate 【发布时间】:2012-10-23 10:46:19 【问题描述】:

我正在使用 UICollectionView,并且我通过继承该类定义了一个自定义 UICollectionViewCell。类的初始化器定义了两个视图,就像这样:

    [[NSBundle mainBundle] loadNibNamed:@"ProtelViewCellFlipped" owner:self options:nil];

    CATransform3D transform = CATransform3DMakeRotation(M_PI, 0, 1, 0);
    [flippedView.layer setTransform:transform];
    [flippedView setHidden:YES];
    [self addSubview:flippedView];

    [[NSBundle mainBundle] loadNibNamed:@"ProtelViewCell" owner:self options:nil];
    [self addSubview:selfView];
    [selfView.layer setZPosition:1];

其中flippedView 是“ProtelViewCellFlipped”xib 文件定义的视图,selfView 是“ProtelViewCell”xib 文件中定义的视图。视图层次结构是这样的:the view hierarchy http://massimomarra.altervista.org/gerarchia.png

问题是翻转视图被CATransform3D 旋转(好像它是“selfView”视图的另一侧),然后它被隐藏了。没关系,它有效。

selfView 视图上有一个 UIButton。在视图的右下角。如果我按下那个按钮,这个方法就会被触发:

- (void)infoButtonPressed:(UIButton *)sender

    NSString *animationKey = (selfView.layer.zPosition > flippedView.layer.zPosition)? @"forward" : @"backwards";
    CGFloat animationDuration = 0.3;

    if (selfView.layer.zPosition > flippedView.layer.zPosition)
        [self.layer removeAllAnimations];

    CABasicAnimation *rotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];
    [rotation setValue:animationKey forKey:@"id"];
    rotation.toValue = [NSNumber numberWithFloat:M_PI];
    rotation.duration = animationDuration;
    rotation.removedOnCompletion = NO;
    rotation.fillMode = kCAFillModeForwards;
    [self.layer addAnimation:rotation forKey:animationKey];

    [self performSelector:@selector(flipLayers) withObject:nil afterDelay:animationDuration/2];

这样self 视图会随着动画一起旋转。此外,在动画期间调用此方法:

- (void)flipLayers

    [selfView setHidden:!selfView.hidden];
    [flippedView setHidden:!selfView.hidden];

    [selfView.layer setZPosition:flippedView.layer.zPosition];
    [flippedView.layer setZPosition:(1-selfView.layer.zPosition)];

这样flippedView 变得可见(而selfView 隐藏),并且其层的zPosition 变得高于selfView

所以现在我看到了flippedView,并且它显示正确。它还有一个按钮,但要触发他的动作,我必须在另一个位置点击:flipped view scheme: i have to tap where the button "was" before the rotation http://massimomarra.altervista.org/s03KRJAUk7C_nP3yTXb7TBQ.png

似乎旋转只是修改了视图的图形,而不是内容。 你能帮帮我吗?

提前谢谢大家!!

【问题讨论】:

【参考方案1】:

在改变方向之前将按钮转换回标识

类似这样的:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 


    oneButton.transform=CGAffineTransformIdentity;

我不知道为什么,但它似乎有效

【讨论】:

以上是关于超级视图旋转后UIButton没有收到触摸的主要内容,如果未能解决你的问题,请参考以下文章

NSLayoutConstraint 后子视图中的 UIButton 未收到触摸

检测 UIButton 触摸子视图

UIButtonTypeInfoDark Touch Area

iOS:如何将触摸事件从子视图转发到超级视图? [复制]

使用 CABasicAnimation 旋转的 UIButton 不会移动初始触摸坐标

Swift:在自定义视图中未调用 UIButton 触摸事件