Ios 在已设置重力/碰撞/弹性的Swift中移动对象(UIView)
我想在swift中创建一个正方形,从屏幕顶部开始,然后下降到屏幕底部并保持在那里。我也希望能够用我的手指将它拖向顶部,使它再次朝屏幕底部落下。有什么建议吗 我已经能够创建一个落在屏幕底部的正方形。我也能用手指移动它。但问题是,每当我移动它时,正方形就停留在同一个地方。我移动后,重力/碰撞/弹性似乎不起作用。我想让它在我把手指从正方形上拿开后掉下来。下面是我的代码摘录。我可能错过了一些简单的事情。任何提示都将不胜感激Ios 在已设置重力/碰撞/弹性的Swift中移动对象(UIView),ios,swift3,Ios,Swift3,我想在swift中创建一个正方形,从屏幕顶部开始,然后下降到屏幕底部并保持在那里。我也希望能够用我的手指将它拖向顶部,使它再次朝屏幕底部落下。有什么建议吗 我已经能够创建一个落在屏幕底部的正方形。我也能用手指移动它。但问题是,每当我移动它时,正方形就停留在同一个地方。我移动后,重力/碰撞/弹性似乎不起作用。我想让它在我把手指从正方形上拿开后掉下来。下面是我的代码摘录。我可能错过了一些简单的事情。任何提示都将不胜感激 import UIKit class ViewController: UIVi
import UIKit
class ViewController: UIViewController {
var greenSquare: UIView?
var redSquare:UIView?
var animator: UIDynamicAnimator?
override func viewDidLoad() {
super.viewDidLoad()
createFallingObject()
func createFallingObject() {
//remove square from superview
redSquare?.removeFromSuperview()
//create the shape
var dimen = CGRect(x: 130,y: 25,width: 90,height: 90)
redSquare = UIView(frame: dimen)
redSquare?.backgroundColor = UIColor.red
//then add to the screen
self.view.addSubview(redSquare!)
//Initialize the animator
animator = UIDynamicAnimator(referenceView: self.view)
//Add gravity to the squares
let gravity = UIGravityBehavior(items: [redSquare!])
let direction = CGVector(dx: 0.0, dy: 0.05)
gravity.gravityDirection = direction
//Collision
let boundaries = UICollisionBehavior(items: [redSquare!])
boundaries.translatesReferenceBoundsIntoBoundary = true
//Elasticity
let bounce = UIDynamicItemBehavior(items: [redSquare!])
bounce.elasticity = 0.3
// 1. create a gesture recognizer (tap gesture)
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
//add pan gesture Regcognizer to the red square
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
redSquare?.addGestureRecognizer(panGestureRecognizer)
animator?.addBehavior(boundaries)
animator?.addBehavior(bounce)
animator?.addBehavior(gravity)
}
//this method handle pan
func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) {
if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
let translation = gestureRecognizer.translation(in: self.view)
// note: 'view' is optional and need to be unwrapped
gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x + translation.x, y: gestureRecognizer.view!.center.y + translation.y)
gestureRecognizer.setTranslation(CGPoint.zero, in: self.view)
//redSquare?.frame.origin.x = translation.x
//redSquare?.frame.origin.y = translation.y
}
}
// 3. this method is called when a tap is recognized
func handleTap(sender: UITapGestureRecognizer) {
createFallingObject()
}
}
当平移手势开始时,应将项目从
UIDynamicAnimator
中删除,并在结束时将其添加回
将视图添加到动态动画师时,其位置应由动画师和动画师单独确定。从动画师中删除该项目将允许视图使用其帧正常定位。将其添加回动画师将使动画师从其当前状态恢复定位
或者,如果您需要手动更新项目的位置(即,不基于动画师的物理),您应该调用
animator.updateItem(使用CurrentState:myDynamicItem)
,其中myDynamicItem
是您要更新的项目。谢谢beyowulf。animator?.removeAllBehavior()在平移手势例程中完成了该操作