2015-08-24 20 views
1

我遇到UIKit的动力,现在,这里是我想怎样做:如何在应用UIKit Dynamics的重力时获得UIView的帧更新?

  1. 利用重力=>OK
  2. 从屏幕顶部的“滴”多UIView的实例底部
  3. 当每个视图距离底部的距离像100px时触发一个事件。 =>NOT OK :(

这里是我的尝试:

  1. 添加于观察者的 “框架” 属性为每个视图=>我不知道为什么,但observeValueForKeyPath是从来没有呼吁(见下面的代码)...
  2. 为每个视图添加一个透明的碰撞边界,并收听UICollisionBehaviorDelegate =>这种有效,但它不是我想要的行为,因为当然,视图是“停止“由边界我希望它往下走

这是我的测试代码:

var animator: UIDynamicAnimator! 
var gravity: UIGravityBehavior! 
override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    self.animator = UIDynamicAnimator(referenceView: view) 
    self.gravity = UIGravityBehavior() 
    self.animator.addBehavior(gravity) 

    let timer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: Selector("createView"), userInfo: nil, repeats: true) 
} 

func createView() { 
    var newView = UIView(frame: CGRectMake((UIScreen.mainScreen().bounds.size.width/2) - 20, -40, 40, 40)) 
    self.view.addSubview(newView) 

    self.gravity.addItem(newView) 

    newView.addObserver(self, forKeyPath: "frame", options: NSKeyValueObservingOptions.New, context: nil) 
} 

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 
    if keyPath == "frame" { 
     if let newView = object as? UIView { 
      println(newView.frame.origin.y) 
      if (newView.frame.origin.y > UIScreen.mainScreen().bounds.size.height - 100) { 
       println("Trigger event !") 
      } 
     } 
    } 
} 

有了这个代码,该意见将趴下正确,但没有将触发事件时,它的意见是100px的远底部

我将不胜感激任何帮助

回答

1

做到这一点是通过添加UICollisionBehavior的一种方式,创造了底部上方的视图位置100像素,并确定其将被称为一个动作时,您的项目与此相撞。

我现在不能为你创建一个样本,但http://www.raywenderlich.com/50197/uikit-dynamics-tutorial会很有帮助,请查找一个名为“隐形边界和碰撞”的部分。这是客观的C,但是,但这不应该是一个问题,因为这很容易。

+0

正如我在我的原始说我试图碰撞。但碰撞问题是......碰撞^^。而且我不想要这种行为,如果您愿意,我希望意见能够“穿越”碰撞。这就是为什么我尝试KVO没有成功。 – Ticko

+0

你是对的,对不起,我有点急。如果通过从UICollisionBehavior中删除有问题的项目(视图碰撞)来检测它,那么它是否会起作用? – Skrew

+0

我只是试过,但下降的意见反弹了一点之前,我可以删除碰撞行为:( – Ticko

0

我一直在尝试做这个工作,真的应该有一个来自UIDynamicAnimator的委托回调后,它更新帧。

我已经成功地解决这个问题是这样的:

class FrameReportingView: UIView { 

    override var center: CGPoint { 
     didSet{ 
      print("center: \(center)") 
     } 
    } 
} 

我使用的是UIPushBehavior和中心设定每帧。您可以在FrameReportingView上实施代理以在更改中心后创建回叫。