1. ホーム
  2. ios

[解決済み] convertRect:toView:、convertRect:FromView:、convertPoint:toView:、convertPoint:fromView:メソッドについて理解する。

2022-07-07 18:03:16

質問

これらのメソッドの機能性を理解しようとしています。そのセマンティクスを理解するために、簡単なユースケースを提供していただけませんか?

ドキュメントから、例えば convertPoint:fromView: メソッドは次のように記述されています。

与えられたビューの座標系から、受信機の座標系に点を変換する。

は何をするのでしょうか? 座標系 の意味は?についてはどうですか? レシーバ ?

例えば convertPoint:fromView: のような使い方は意味があるのでしょうか?

CGPoint p = [view1 convertPoint:view1.center fromView:view1];

NSLogユーティリティを使用して、以下のことを確認しました。 p の値と一致することを確認しました。 view1 の中心と一致する。

よろしくお願いします。

EDITです。 興味のある方のために、これらのメソッドを理解するための簡単なコードスニペットを作成しました。

UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 150, 200)];
view1.backgroundColor = [UIColor redColor];
    
NSLog(@"view1 frame: %@", NSStringFromCGRect(view1.frame));        
NSLog(@"view1 center: %@", NSStringFromCGPoint(view1.center));   
    
CGPoint originInWindowCoordinates = [self.window convertPoint:view1.bounds.origin fromView:view1];        
NSLog(@"convertPoint:fromView: %@", NSStringFromCGPoint(originInWindowCoordinates));
    
CGPoint originInView1Coordinates = [self.window convertPoint:view1.frame.origin toView:view1];        
NSLog(@"convertPoint:toView: %@", NSStringFromCGPoint(originInView1Coordinates));

いずれの場合も self.window がレシーバです。しかし、違いがあります。最初のケースでは convertPoint パラメータで表現されるのは view1 の座標で表される。出力は以下のようになる。

convertPoint:fromView: {100, 100}

2つ目では、代わりに convertPoint はスーパービューで表現されます ( self.window ) の座標で表現されます。出力は以下のようになります。

convertPoint:toView: {0, 0}

どのように解決するのですか?

各ビューは独自の座標系を持っています。原点は0,0、幅と高さがあります。これは bounds の矩形に記述されます。ビューの frame は、その原点をスーパービューの境界矩形内の点に持ちます。

ビュー階層の一番外側のビューは、iOSの画面の左上に対応する0,0を原点とします。

このビューに 20,30 でサブビューを追加すると、サブビューの 0,0 の点は、スーパービューの 20,30 の点に対応します。この変換が、それらのメソッドが行っていることです。

上の例は、ビューからそれ自身に点を変換しているので、無意味です(ダジャレではありません)。ビューが画面の外に移動しているかどうかをテストするために、ビューのある点がそのスーパー ビューに関連してどこにあるかを見つける方が一般的でしょう。

CGPoint originInSuperview = [superview convertPoint:CGPointZero fromView:subview];

receiver" は objective-c の標準的な用語で、メッセージを受け取るオブジェクトのことです(メソッドもメッセージと呼ばれます)ので、この例では receiver は superview .