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, если кто-то хочет обмануть.

Другие вопросы по тегам