Autolayout,UIDynamics和animation

我很新的自动布局,我很困惑如何animation的意见。

我读了很多,我知道你必须坚持约束,编辑它,并将layoutIfNeeded包装在UIViewanimation块中。

但是说到做到这一点,我有点迷路了。 如果有人能向我解释这个animation是如何完成的,我很乐意。

我认为它可能使用UIPanGestureRecognizer来将前导空间的constant更改为容器约束,但是它可能使用了UIDynamics(右边的弹跳效果)。

那么,用UIPanGestureRecognizer + [UIView animateWithDuration:animations:]就可以实现类似的行为。 是的,您设置了领先的空间约束,并根据UIPanGestureRecognizer状态进行更改。 请记住,您只需要设置最终约束(定义滑块的最终位置)。 中级animation职位是为你计算的。 对于滑块,我们有默认的左侧位置和激活的中间位置。

对于视图旋转,我们可以使用UIView transform属性。

IB中的Autolayout约束:

IB中的Autolayout约束

设置animation选项( UIViewAnimationOptionCurveEaseOutanimation曲线)可以给人一种反弹效果的感觉。 UIPanGestureRecognizer代码(省略实例variables声明,因为它们的名字是不言自明的):

 - (IBAction)onPan:(UIPanGestureRecognizer*)sender { switch (sender.state) { case UIGestureRecognizerStateBegan: _startOffset = self.leadingSpace.constant; _maxOffset = self.slider.superview.frame.size.width - kHorizontalPadding - self.slider.frame.size.width; break; case UIGestureRecognizerStateChanged: { CGFloat offset = _startOffset + [sender translationInView:self.slider.superview].x; offset = MIN(offset, _maxOffset); self.leadingSpace.constant = offset; break; } case UIGestureRecognizerStateEnded: { CGFloat offset = _startOffset + [sender translationInView:sender.view.superview].x; UIColor *bgColor = [UIColor lightGrayColor]; CGFloat rotation = 0; if (offset < _maxOffset) { offset = kHorizontalPadding; } else { offset = (_maxOffset + kHorizontalPadding)/2; bgColor = [UIColor redColor]; rotation = M_PI_2; } self.leadingSpace.constant = offset; [UIView animateWithDuration:.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ [self.slider layoutIfNeeded]; self.slider.backgroundColor = bgColor; self.slider.transform = CGAffineTransformMakeRotation(rotation); } completion:nil]; break; } default: break; } } 

animation结果与UIViewAnimationOptionCurveLinear (捕获模拟器):

动画结果

animation结果与UIViewAnimationOptionCurveEaseOut (捕获模拟器):

动画结果

UIDynamics

随着UIDynamics事情变得更加复杂。 好的起点是Ray Wenderlich UIKit Dynamics教程 。

为了popup滑块,我们可以添加以下行为:

  • UIGravityBehavior拉动滑块开始位置。 我们需要改变angle属性来将重力引导到左边。
  • UICollisionBehavior定义允许移动的左边和右边。 如果我们将父视图视为边界,则translatesReferenceBoundsIntoBoundary属性将会很有用。 另外,我们需要使用addBoundaryWithIdentifier:fromPoint:toPoint (或bezier path)来添加额外的边界来停止滑块。
  • UIDynamicItemBehavior改变elasticy和可能的resistance属性分别configuration反弹和加速度。
  • 可能与识别器的velocityInView:结合使用的UIPushBehavior velocityInView:在用户释放滑块时指定滑块速度
  • 可能是UISnapBehavior作为UISnapBehavior的替代UIGravityBehavior