我试着构建像tinder一样的界面,当手指被释放时,我想让view捕捉到父视图的中心。我试图用快照行为和平移手势识别器来实现它,但我看到了倒下视图的动画。

我的代码如下
class ViewController: UIViewController {
var d = UIView()
var snap: UISnapBehavior!
var animator:UIDynamicAnimator!
override func viewDidLoad() {
super.viewDidLoad()
d.translatesAutoresizingMaskIntoConstraints = false
d.backgroundColor = .redColor()
view.addSubview(d)
d.heightAnchor.constraintEqualToConstant(150).active = true
d.widthAnchor.constraintEqualToConstant(150).active = true
d.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
d.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true
d.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: "pan:"))
animator = UIDynamicAnimator(referenceView: d)
}
func pan(gesture:UIPanGestureRecognizer) {
switch gesture.state {
case .Changed:
d.frame.origin.x = gesture.translationInView(d).x
case .Ended:
snap = UISnapBehavior(item: d, snapToPoint: view.center)
animator.addBehavior(snap)
default:
break
}
}
}发布于 2016-09-18 01:06:23
您应该将UIDynamicAnimator的referenceView设置为查看而不是d。
animator = UIDynamicAnimator(referenceView: view)下面是我平移手势通常使用的代码。它还会在平移时倾斜块:
func pan(gesture:UIPanGestureRecognizer) {
let panLocationInView = gesture.locationInView(view)
let panLocationInD = gesture.locationInView(d)
switch gesture.state {
case .Began:
animator.removeAllBehaviors()
let offset = UIOffsetMake(panLocationInD.x - CGRectGetMidX(d.bounds), panLocationInD.y - CGRectGetMidY(d.bounds))
attachmentBehaviour = UIAttachmentBehavior(item: d, offsetFromCenter: offset, attachedToAnchor: panLocationInView)
animator.addBehavior(attachmentBehaviour!)
case .Changed:
attachmentBehaviour?.anchorPoint = panLocationInView
case .Ended:
animator.removeAllBehaviors()
animator.addBehavior(UISnapBehavior(item: d, snapToPoint: view.center))
default:
break
}
}

https://stackoverflow.com/questions/39548027
复制相似问题