Là một phần của việc triển khai UICollisionBehaviour tôi thiết lập các ranh giới cho cạnh màn hình. Sau đó tôi đã thêm một số khung nhìn và cuối cùng đính kèm một UIPanGestureRecognizer vào một trong số chúng.UICollisionBehavior - lượt xem vượt qua các ranh giới
Bây giờ tôi có thể đẩy xung quanh các chế độ xem nhỏ hơn bằng chế độ xem có thể kéo của tôi.
Vấn đề: Nếu tôi dồn một cái nhìn nhỏ hơn và tiếp tục đẩy nó chống lại các cạnh màn hình, nó sẽ cuối cùng trượt qua ranh giới và bị mắc kẹt ở phía bên kia. "Cái nhìn búa" của tôi mà tôi sử dụng để đánh và đẩy các khung cảnh khác xung quanh cũng sẽ bị kẹt trong ranh giới. I E. nó bị kẹt/không thể kéo được ở phía bên của màn hình.
Tôi đã làm một ví dụ rất nhỏ để xem liệu tôi có thể tái tạo nó khi tôi có rất ít lượt xem và không có hành vi xung đột, lượt xem vẫn đi qua ranh giới. Hoặc UIDynamics không thể xử lý rất nhiều, hoặc (nhiều khả năng) tôi bằng cách nào đó cấu hình nó sai.
Các ví dụ nhỏ dưới đây có hành vi kỳ lạ:
class ViewController: UIViewController {
var animator: UIDynamicAnimator?
var collisionBehaviour: UICollisionBehavior?
var panBehaviour: UIAttachmentBehavior?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
setup()
}
func setup() {
//setup collisionBehaviour and animator
collisionBehaviour = UICollisionBehavior()
collisionBehaviour!.collisionMode = UICollisionBehaviorMode.allZeros
animator = UIDynamicAnimator(referenceView: view)
//add boundaries
collisionBehaviour!.addBoundaryWithIdentifier("verticalMin", fromPoint: CGPointMake(0, 0), toPoint: CGPointMake(0, CGRectGetHeight(view.frame)))
collisionBehaviour!.addBoundaryWithIdentifier("verticalMax", fromPoint: CGPointMake(CGRectGetMaxX(view.frame), 0), toPoint: CGPointMake(CGRectGetMaxX(view.frame), CGRectGetHeight(view.frame)))
collisionBehaviour!.addBoundaryWithIdentifier("horizontalMin", fromPoint: CGPointMake(0, CGRectGetMaxY(view.frame)), toPoint: CGPointMake(CGRectGetMaxX(view.frame), CGRectGetMaxY(view.frame)))
collisionBehaviour!.addBoundaryWithIdentifier("horizontalMax", fromPoint: CGPointMake(0, 0), toPoint: CGPointMake(CGRectGetMaxX(view.frame), 0))
// collisionBehaviour!.translatesReferenceBoundsIntoBoundary = true // same effect as the above boundaries
//setup up some round views to push around
for i in 0..<5 {
let ball = UIView(frame: CGRectMake(0, 30, 50, 50))
ball.center = view.center
ball.backgroundColor = UIColor.greenColor()
ball.layer.cornerRadius = CGRectGetWidth(ball.frame) * 0.5
view.addSubview(ball)
collisionBehaviour!.addItem(ball)
}
//setup a hammer view which can be dragged and used to squeze the ball views of the screen
let hammer = UIView(frame: CGRectMake(0, 0, 100, 100))
hammer.backgroundColor = UIColor.redColor()
view.addSubview(hammer)
collisionBehaviour!.addItem(hammer)
let noRotationBehaviour = UIDynamicItemBehavior(items: [hammer])
noRotationBehaviour.allowsRotation = false
animator!.addBehavior(noRotationBehaviour)
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector("handlePan:"))
hammer.addGestureRecognizer(panGestureRecognizer)
//"start" the collision detection
animator!.addBehavior(collisionBehaviour!)
}
//Move the hammer around
func handlePan(recognizer: UIPanGestureRecognizer) {
if let view = recognizer.view {
let location = recognizer.locationInView(self.view)
switch recognizer.state {
case .Began:
panBehaviour = UIAttachmentBehavior(item: view, attachedToAnchor: location)
animator!.addBehavior(panBehaviour!)
println("begin")
case .Changed:
panBehaviour!.anchorPoint = location
println("change \(location)")
case .Ended:
println("ended")
animator!.removeBehavior(panBehaviour!)
default:
println("done")
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Nhờ sự giúp đỡ nhất định.
Thêm một thẻ Swift để giúp câu hỏi của bạn để được nhìn thấy. – iOSAaronDavid
Tôi cũng thấy điều này xảy ra. Có vẻ như khi một lượt xem bị áp lực qua một biên giới, nó gần như tạo thành một lỗ mà qua đó các khung nhìn khác có thể đi qua. Tò mò để nghe bất kỳ câu trả lời nào. – Warpling