gpt4 book ai didi

swift - 在 Swift 的 UIKit Dynamics 中,如何定义一个圆边界来包含一个 UIView?

转载 作者:搜寻专家 更新时间:2023-10-31 22:18:07 24 4
gpt4 key购买 nike

我研究了很多,但我在任何地方都能找到的唯一示例是为了定义 UIView 的边界,以便它们在对象的外部相互碰撞/反弹。

示例:一个球撞击另一个球,它们相互弹开。

但我想要做的是创建一个圆形 View 来包含其他 UIView,这样包含边界是一个圆,而不是默认的正方形。有办法实现吗?

最佳答案

是的,这完全可能。实现圆内碰撞的关键是

  1. 将碰撞行为的边界设置为圆形路径(自定义UIBezierPath)和
  2. 将动画师的 referenceView 设置为圆形 View 。

输出:

Output

Storyboard设置:

Storyboard Setup

下面是上述 Storyboard 的 View Controller 代码。魔法发生在 simulateGravityAndCollision 方法中:

Full Xcode project

class ViewController: UIViewController {

@IBOutlet weak var redCircle: UIView!
@IBOutlet weak var whiteSquare: UIView!

var animator:UIDynamicAnimator!

override func viewDidLoad() {
super.viewDidLoad()
self.redCircle.setCornerRadius(self.redCircle.bounds.width / 2)
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) { [unowned self] in
self.simulateGravityAndCollision()
}
}

func simulateGravityAndCollision() {

//The dynamic animation happens only within the reference view, i.e., our red circle view
animator = UIDynamicAnimator.init(referenceView: self.redCircle)

//Only the inside white square will be affected by gravity
let gravityBehaviour = UIGravityBehavior.init(items: [self.whiteSquare])

//We also apply collision only to the white square
let collisionBehaviour = UICollisionBehavior.init(items:[self.whiteSquare])

//This is where we create the circle boundary from the redCircle view's bounds
collisionBehaviour.addBoundary(withIdentifier: "CircleBoundary" as NSCopying, for: UIBezierPath.init(ovalIn: self.redCircle.bounds))

animator.addBehavior(gravityBehaviour)
animator.addBehavior(collisionBehaviour)
}

}

extension UIView {

open override func awakeFromNib() {
super.awakeFromNib()
self.layer.allowsEdgeAntialiasing = true
}

func setCornerRadius(_ amount:CGFloat) {
self.layer.cornerRadius = amount
self.layer.masksToBounds = true
self.clipsToBounds = true
}
}

关于swift - 在 Swift 的 UIKit Dynamics 中,如何定义一个圆边界来包含一个 UIView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49702341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com