首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIImages和UIViews在iOS Swift中没有碰撞吗?

UIImages和UIViews在iOS Swift中没有碰撞吗?
EN

Stack Overflow用户
提问于 2018-03-28 12:58:31
回答 1查看 136关注 0票数 0

我试图碰撞两个使用pan手势的UIViews对方。现在我可以拖动一个视图,但是当将视图拖到下一个视图时,它会相互碰撞。它落后于其他观点。

以下是截图结果:

这是我用来拖动,平移和碰撞物理属性的代码。

代码语言:javascript
复制
import UIKit

class ViewController: UIViewController {

var greenSquare: UIView?
var redSquare: UIView?
var animator: UIDynamicAnimator?
var snap: UISnapBehavior!
var panGesture       = UIPanGestureRecognizer()


@IBAction func pan(_ sender: UIPanGestureRecognizer) {

    let tapPoint: CGPoint = sender.location(in: view)

    if (snap != nil) {
        animator?.removeBehavior(snap)
    }

    snap = UISnapBehavior(item: greenSquare!, snapTo: tapPoint)
    animator?.addBehavior(snap)

}

override func viewDidLoad() {
    super.viewDidLoad()

    var dimen = CGRect(x: 25, y: 25, width: 120, height: 120)
    greenSquare = UIView(frame: dimen)
    greenSquare?.backgroundColor = UIColor.green

    dimen = CGRect(x: 130, y: 25, width: 100, height: 100)
    redSquare = UIView(frame: dimen)
    redSquare?.backgroundColor = UIColor.red

    self.view.addSubview(greenSquare!)
    self.view.addSubview(redSquare!)

    animator = UIDynamicAnimator(referenceView: self.view)

    let gravity = UIGravityBehavior(items: [greenSquare!, redSquare!])
    let direction = CGVector(dx: 0.0, dy: 1.0)
    gravity.gravityDirection = direction

    let boundries = UICollisionBehavior(items: [greenSquare!, redSquare!])
    boundries.translatesReferenceBoundsIntoBoundary = true

    let bounce = UIDynamicItemBehavior(items: [greenSquare!, redSquare!])
    bounce.elasticity = 0.5



    animator?.addBehavior(bounce)
    animator?.addBehavior(boundries)
    animator?.addBehavior(gravity)


    panGesture = UIPanGestureRecognizer(target: self, action:#selector(draggedView(sender:)))
    greenSquare?.isUserInteractionEnabled = true
    greenSquare?.addGestureRecognizer(panGesture)

 }

@objc func draggedView(sender:UIPanGestureRecognizer){
    let translation = sender.translation(in: self.view)
    greenSquare?.center = CGPoint(x: (greenSquare?.center.x)! + translation.x, y: (greenSquare?.center.y)! + translation.y)
    sender.setTranslation(CGPoint.zero, in: self.view)
}



}//class`

任何人都可以帮我解决这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-28 14:16:09

问题是动画师只识别greenSquare起源处的碰撞。在本例中,它位于屏幕的顶部。您可以在移动greenSquare之后更新动画器上的碰撞位置。将animator?.updateItem(usingCurrentState: greenSquare!)添加到draggedView方法的末尾。您不需要为此使用UISnapBehavior,因此可以删除代码顶部的IBAction func pan方法。当您手动移动视图时,updateItem(usingCurrentState:)调用将重置碰撞屏障所在的位置,而物理引擎并没有对其进行操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49535257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档