UIPangesture< - > UIView动画故障

时间:2014-05-09 12:40:38

标签: ios objective-c animation uiview autolayout

我的UIView动画遇到了烦人的问题。基本上我按照手指位置做了一个UIView旋转动画。当视图完全加载时,一切正常,但如果用户拖动手指,而新数据(视图内容)从我的Web服务传入,则视图将跳离屏幕。当用户滚动一点时,视图会跳回到它的位置,一切都很好。那么我该怎么办才能防止这种跳跃。

我认为传入的数据会触发类似layoutIfNeeded的内容,这会影响动画的位置。 另一个想法是它与我的autoLayout约束冲突。

动画完成如下:

- (IBAction)handlePan:(UIPanGestureRecognizer *)gesture {

  UIView *currentView = self.viewToAnimate;

  CGPoint translation = [gesture translationInView:gesture.view.superview];
  CGFloat percent = translation.x / gesture.view.bounds.size.width;

  CATransform3D transform = CATransform3DIdentity;
  transform.m34 = 1.0 / -800;
  currentView.layer.transform =
      CATransform3DRotate(transform, M_PI * percent, 0.0, 1.0, 0.0);

      //Snap back if the users lifts his finger
  if (gesture.state == UIGestureRecognizerStateEnded ||
      gesture.state == UIGestureRecognizerStateCancelled ||
      gesture.state == UIGestureRecognizerStateFailed) {

    [UIView animateWithDuration:0.45
        delay:0.0
        options:UIViewAnimationOptionCurveEaseInOut
        animations:^{ currentView.transform = CGAffineTransformIdentity; }
        completion:nil];
  }
}

2 个答案:

答案 0 :(得分:0)

关于你直接解决这个问题的方法和方法的信息太少了。这些观点是什么类型的,您是否以编程方式生成视图...

最有可能发生的事情是两种情况之一。

首先,视图本身调用self来刷新,在这种情况下,它设置其变换ti标识。如果是这种情况,您需要做的就是将此视图添加到另一个超级视图并将变换应用于该超级视图,而不是视图本身。

第二种可能性是superview调用视图重新定位。在这种情况下,您可能希望通过在其中一个视图上设置一些参数来中断此类操作,以便自动停止或尝试分析此调用的来源。

要分析调用此视图以重新定位的内容,我建议您对视图进行子类化,如果需要,甚至覆盖图层并覆盖setFramesetTransform等方法,并在那里添加断点。

答案 1 :(得分:0)

我设法让它与[self.viewToAnimate setTranslatesAutoresizingMaskIntoConstraints:YES];合作。

我认为我的约束在加载过程中重新定位了视图,因为视图正在增长。在减少IB中的约束优先级并将translatesAutoresizingMaskIntoConstraints设置为YES后,一切都按预期工作。