2012-09-05 65 views
0

我有什麼:檢測另一個的UIView內的UIView運動

當我移動UIView我做檢測其運動如下:

[myView.layer addObserver:self forKeyPath:@"position" options:NSKeyValueObservingOptionNew context:nil]; 

作爲myViewUIView我移動和self我必須檢測UIView所具有的不同位置。

的問題:

當我把myView內的另一個UIView和我移動anotherView

[anotherView addSubview: myView]; 

的方法:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; 

不再被調用,雖然在理論myView也在發生變化。每次發生「移動」時,我都嘗試使用NSNotification來解除,但我覺得它很笨拙。這種問題有沒有「優雅」的解決方案?


對於UIView的運動,我用這個方法:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 
+0

下面發佈的解決方案是否適合您? –

回答

2

我在這裏上傳了一個示例項目,這是否乾淨:

https://github.com/n9986/ObservingUIViewMovement

我也有類似要求的某個時候回來。這裏的問題是,當你將UIView添加到另一個UIView(稱爲超級視圖)時,它現在駐留在superView的座標空間中。因此,superView在其父座標空間中的移動不會影響其子節點。

我會在這裏解釋一下代碼。

我們有ViewController,MyViewInsideView類說明你的典型類。我想在viewController中觀察InsideView是否已經移動。所以在自定義類中,我添加了一個屬性positionInWindow,並在超級視圖移動時更新它。

所以在InsideView.m

// Make sure this property exists in .h file to make the class KVC compliant 
@synthesize positionInWindow; 

// This method is called when the super view changes. 
- (void)didMoveToSuperview 
{ 
    // Drop a random log message 
    NSLog(@"MAI SUPERVIEW HAS CHANGED!!!"); 

    // Start observing superview's frame 
    [self addObserver:self 
      forKeyPath:@"superview.frame" 
       options: NSKeyValueObservingOptionNew 
       context:nil]; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 
{ 
    // Here we update the positionInWindow because 
    // we know the superView.frame has changed 
    CGPoint frameOrigin = self.frame.origin; 
    [self setPositionInWindow:[[self window] convertPoint:frameOrigin 
               fromView:self]]; 
} 

以及任何你想要監控這樣的觀點:

// On an instance of InsideView 
[insideView addObserver:self 
      forKeyPath:@"positionInWindow" 
       options:NSKeyValueObservingOptionNew 
       context:nil]; 

關於這個解決方案的很大一部分是InsideView並不需要知道誰是它的superView。即使後面更改了superView,此代碼也可以正常工作。 MyView類沒有修改。任何類都可以獨立於這個事實來監視它的屬性。

+0

如果superview.superview.frame發生了變化,會發生什麼情況?所以這隻會檢測到直接超級視圖的變化,但其他層次結構呢? – Zorayr

1

據我所知,UIView的的不動「自己的」,這意味着你可能有一些代碼身邊有對運動

也許嘗試設置一些委託或通知了,而不是使用的addObserver:

+0

你可以檢查我的編輯。 – Peres

+0

在touchesMoved,你在做什麼像「myView.frame = ...」?這就是你的後 – Ismael

+0

'UIView'的運動是好的...我只是想知道(KVO)當'UIView'在另一個'UIView'裏面,它正在移動... – Peres