1

私が持っているもの:

を動かすとUIView、次のようにしてその動きを検出しています。

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

私は動いていmyViewて、クラスが持っているさまざまな位置を検出する必要があります。UIViewselfUIView

問題:

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;
4

2 に答える 2

2

これをきれいに行うサンプルプロジェクトをここにアップロードしました:

https://github.com/n9986/ObservingUIViewMovement

以前にも同様の要件がありました。ここでの問題は、UIView を別の UIView (superView と呼びます) に追加すると、superView の座標空間に存在するようになることです。したがって、親の座標空間での superView の移動は、子には影響しません。

ここでコードを少し説明します。

ViewControllerMyViewおよびInsideViewクラスがあり、典型的なクラスを示しています。InsideViewが移動したかどうかをviewControllerで観察したい。そのため、カスタム クラスにプロパティを追加しpositionInWindow、superView が移動するたびに更新しました。

だからで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クラスの変更はありません。そして、どのクラスもその事実とは無関係にそのプロパティを監視できます。

于 2012-09-06T10:55:11.783 に答える
1

私の知る限り、UIViewは「単独で」移動することはありません。つまり、移動用のコードがそこにある可能性があります。

addObserverを使用する代わりに、そこにデリゲートまたは通知を設定してみてください。

于 2012-09-05T14:53:01.953 に答える