Autolayout,UIDynamics和animation
我很新的自动布局,我很困惑如何animation的意见。
我读了很多,我知道你必须坚持约束,编辑它,并将layoutIfNeeded
包装在UIView
animation块中。
但是说到做到这一点,我有点迷路了。 如果有人能向我解释这个animation是如何完成的,我很乐意。
我认为它可能使用UIPanGestureRecognizer
来将前导空间的constant
更改为容器约束,但是它可能使用了UIDynamics(右边的弹跳效果)。
那么,用UIPanGestureRecognizer
+ [UIView animateWithDuration:animations:]
就可以实现类似的行为。 是的,您设置了领先的空间约束,并根据UIPanGestureRecognizer
状态进行更改。 请记住,您只需要设置最终约束(定义滑块的最终位置)。 中级animation职位是为你计算的。 对于滑块,我们有默认的左侧位置和激活的中间位置。
对于视图旋转,我们可以使用UIView
transform
属性。
IB中的Autolayout约束:
设置animation选项( UIViewAnimationOptionCurveEaseOut
animation曲线)可以给人一种反弹效果的感觉。 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