将子视图添加到Interface Builder中的动态项时,应用程序崩溃

时间:2016-04-13 23:13:51

标签: ios swift cocoa-touch interface-builder uikit-dynamics

因此,我正在使用UI Kit Dynamics创建一个滑块,可以将其滑出以显示其背后的内容。我正在使用两个UIFieldBehaviour,一个附加到UIPanGestureRecognizer的附件行为,以及UICollisionBehaviour来实现这一点。 Interface Builder中的结构如下所示: Here an image of my view hierarchy

TrayContainerView已应用约束,它也是我的DynamicAnimator的参考视图。 trayView是dynamicAnimator所依赖的dynamicItem。

这可以正常工作,直到我从Interface Builder中向trayView添加子视图,此时每当我的应用切换到特定的viewController时,我都会收到此消息:

由于未捕获的异常'无效关联'而终止应用,原因:'UIDynamicAnimator最多支持32个不同的字段'

奇怪的是,如果我以编程方式添加子视图,除了布局的一些问题外,它还能正常工作。

这是我的动态行为的设置

    container = UICollisionBehavior(items: [self])

    let boundaryWidth = UIScreen.mainScreen().bounds.size.width
    container.addBoundaryWithIdentifier("upper", fromPoint: CGPointMake(0, offset), toPoint: CGPointMake(boundaryWidth, offset))

    let boundaryHeight = self.superview!.frame.size.height + self.frame.size.height - self.layoutMargins.top
    container.addBoundaryWithIdentifier("lower", fromPoint: CGPointMake(0,boundaryHeight), toPoint: CGPointMake(boundaryWidth,boundaryHeight))

    tractorField = UIFieldBehavior.linearGravityFieldWithVector(CGVectorMake(0, 30))

    tractorField.direction = CGVectorMake(0, -10)

    let referenceRegion = (superview?.frame)!
    let fieldCoefficient:CGFloat = 1
    tractorField.region = UIRegion(size: CGSize(width: referenceRegion.width, height: referenceRegion.height*fieldCoefficient))
    tractorField.position = CGPointMake((self.superview?.center.x)!, referenceRegion.height*fieldCoefficient/2)
    tractorField.addItem(self)

    gravityField = UIFieldBehavior.linearGravityFieldWithVector(CGVectorMake(0, 30))

    gravityField.direction = CGVectorMake(0, 10)


    gravityField.region = UIRegion(size: CGSize(width: referenceRegion.width, height: referenceRegion.height*fieldCoefficient))
    gravityField.position = CGPointMake((self.superview?.center.x)!, referenceRegion.height + referenceRegion.height*fieldCoefficient/2)
    gravityField.addItem(self)


    animator.addBehavior(gravityField)
    animator.addBehavior(tractorField)

    dynamicItem = UIDynamicItemBehavior(items: [self])

    animator.addBehavior(container)

    animator.addBehavior(dynamicItem)

任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:0)

想出来。问题是我试图将UIView子类化并在那里做所有动态的东西。不幸的是,这不起作用,因为我怀疑动态动画师是早期调用的?我在awakeFromNib中实例化了它,这是导致崩溃的原因。无论如何在viewController的viewDidLoad方法中实现整个事情,它都应该工作。