UICollisionBehavior работает только после добавления в первый раз
Мое приложение имеет пользовательский UIButton с двумя подпредставлениями, которые выглядят так, будто они висят за строки. Когда пользователь нажимает кнопку, один оттягивается, а затем сталкивается с другим. Это работает для меня при первом столкновении, но когда я нажимаю второй раз, предмет не возвращается назад.
По первому звонку layoutSubviews()
Я добавляю оба представления в UIGravityBehavior
и я даю им каждому свое UIAttachmentBehavior
, На touchesBegan
Я добавляю столкновение рядом с видом, которое необходимо вернуть назад, а затем либо на touchesEnded
или после таймера, если это было касание, а не долгое нажатие, я удаляю столкновение, которое удерживало его на месте.
Я сохраняю это столкновение в переменной экземпляра (чтобы оно сохранялось) и создавал его так:
holdCollision = UICollisionBehavior(items: [theView])
holdCollision.addBoundaryWithIdentifier("boundary suspending item in air",
forPath: UIBezierPath(rect: holdCollisionViewFrame))
Если я построю UICollisionBehavior
один раз, а затем позвоните addBehavior
а также removeBehavior
с ним несколько раз, он работает только в первый раз. Если я создаю его с нуля на каждом кране, он всегда работает. Что может быть причиной этого?
Обновление: я придумал пример проекта для отчета в Apple. Вы можете воспроизвести в чистом проекте iOS с одним представлением. Добавьте два вида, один поверх другого, и ссылку на выходы в верхней части. Вид сверху должен быть достаточно большим, чтобы он перекрывался с нижним при первом запуске, иначе вы не увидите проблему. Добавьте две кнопки и подключитесь к действиям внизу.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var topView: UIImageView!
@IBOutlet weak var bottomView: UIView!
var animator: UIDynamicAnimator!
var collision: UICollisionBehavior!
override func viewDidLoad() {
super.viewDidLoad()
animator = UIDynamicAnimator(referenceView: view)
let gravity = UIGravityBehavior(items: [topView])
animator.addBehavior(gravity)
var anchor = view.center
anchor.y -= 100
let attachment = UIAttachmentBehavior(item: topView, attachedToAnchor: anchor)
animator.addBehavior(attachment)
collision = UICollisionBehavior(items: [topView])
collision.addBoundaryWithIdentifier("bottom boundary", forPath: UIBezierPath(rect: bottomView.frame))
}
@IBAction func addCollision() {
NSLog("boundaries: \(collision.boundaryIdentifiers)")
animator.addBehavior(collision)
}
@IBAction func removeCollision() {
animator.removeBehavior(collision)
}
}
1 ответ
Похоже, после того, как я удаляю holdCollision
от UIDynamicAnimator
, он теряет свой список границ. Это похоже на ошибку, и я сообщил об этом как таковой. Это rdar://23593048, если кто-то хочет обмануть.