web-dev-qa-db-ja.com

UIView原点をそのウィンドウ座標系に変換する

ウィンドウ座標系でscrollViewの原点を取得したいのですが。たとえば、現在、scollViewの原点は(0,51)です。しかし、ウィンドウ座標系では、51 + 44(ナビゲーションバーの高さ)+20(ステータスバーの高さ)= 115である必要があります。ウィンドウ座標系では、scrollView.frame.Originは(0,115)である必要があります。私はconvertPoint:メソッドを試してみましたが、(0,51)または(0,0)になることがあります。これに対する解決策を提供してください。ありがとう

30
Nishit

TechZenソリューションを試しましたが、役に立ちませんでした。 scrollViewのOriginを変換する代わりに、Apple docs UIWindow class Referenceを参照し、このコードを使用してキーボードのendCenterをビューの座標系に変換しました[self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow]。このコードは機能し、問題を解決しました。 ただし、scrollView.Originの適切な座標が得られない理由についての質問はまだ残っています。したがって、基本的には、scrollView.Originの代わりにキーボードのエンドセンターを変換することで回避策を得ました。ああ、それから、キーボードが画面に表示されたときのscrollViewの新しい高さを計算するために、これらすべてを行っていました。したがって、誰かがこの問題の解決策またはより良い解決策を持っている場合は、私たち全員に知らせてください。

10
Nishit

適切なビュー間で変換していないようです。ビューのフレームは、自身の内部座標ではなく、そのスーパービューの座標に設定されているため、ビューの原点をウィンドウ座標に変換する場合は、スーパービューを使用する必要があります。

[[self superview] convertPoint:self.frame.Origin toView:theWindow];

ただし、ゼロ点をビュー自体からウィンドウに変換する方が簡単です。 2つのコードは同等であるため、Originを使用する必要はまったくありません。

[self convertPoint:CGPointZero toView:theWindow];
55
TechZen

これらの関数は、ビューコントローラーがサブビューのレイアウトを終了した後にのみ機能することに注意してください。したがって、ビューの読み込み時にそれが必要な場合は、viewDidLayoutSubviews/viewDidAppearを使用できますが、viewDidLoad/viewWillAppearなどでは使用できません。

このコードは私のために働きました:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGPoint originInSuperview = [self.view.superview convertPoint:CGPointZero fromView:self.scrollView];
}
6
david72

Swift 2.1:

ViewControllerのviewDidAppear(それ以外の場合、要素はまだレイヤー化されていません)では、

        var yourFrame = yourScrollView.convertRect(yourScrollView.frame, toView: self.view)

        //PRINT THE WHOLE RECT
        print(yourFrame)

        //PRINT A DETAILED VERSION OF THE FRAME, ALSO CAN PERFORM CALCULATION BETWEEN THE RECT PARAMETERS TO GET , FOR EXAMPLE, WIDTH POINT IN THE SUPERVIEW:
        print("X: \(yourFrame.Origin.x) Y: \(yourFrame.Origin.y) WIDTH: \(yourFrame.width) HEIGHT: \(yourFrame.height)")
2
Juan Boero