簡體   English   中英

如何在將UIKit Dynamics的重力應用於UIView時更新UIView的框架?

[英]How to get UIView's frame update while applying UIKit Dynamics' gravity to it?

我現在正在體驗UIKit Dynamics,這是我想做的事情:

  1. 使用重力=> 確定將多個UIView實例從屏幕頂部“拖放”到底部
  2. 當每個視圖與底部的距離為100px時觸發事件。 => 不好:(

這是我嘗試的:

  1. 在每個視圖的“框架”屬性上添加觀察者=>我不知道為什么,但是從未調用過watchValueForKeyPath (請參見下面的代碼)...
  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遠,則不會觸發任何事件

我將不勝感激任何幫助

一種方法是添加一個UICollisionBehavior,在底部上方創建一個100px的視圖位置,並定義一個動作,當您的項目與此碰撞時將調用該動作。

我現在無法為您創建示例,但是http://www.raywenderlich.com/50197/uikit-dynamics-tutorial將提供很大的幫助,請查找“隱形邊界和碰撞”部分。 雖然是Objective-C,但這不應該成為問題,因為這很容易。

我也一直在嘗試使其工作,實際上,在更新框架之后,應該從UIDynamicAnimator中進行委托回調。

我設法解決了這個問題:

class FrameReportingView: UIView {

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

我正在使用UIPushBehavior並且在每個幀中設置了中心。 您可以在FrameReportingView上實現委托,以在更改中心后創建回調。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM