web-dev-qa-db-fra.com

Convertir un point d'origine UIView en son système de coordonnées de fenêtre

Je veux obtenir l'origine de scrollView dans le système de coordonnées de la fenêtre. Par exemple, actuellement, scollView Origin est (0,51). Mais dans le système de coordonnées de la fenêtre, il doit être 51 + 44 (hauteur de la barre de navigation) +20 (hauteur de la barre d'état) = 115. Signifie dans le système de coordonnées de la fenêtre que scrollView.frame.Origin doit être (0,115). J'ai essayé avec convertPoint: méthodes mais obtenant (0,51) ou (0,0) parfois. Veuillez fournir une solution à cela. Merci

30
Nishit

J'ai essayé avec la solution TechZen mais en vain. Au lieu de convertir l'origine de scrollView, j'ai fait référence à Apple docs Référence de la classe UIWindow et converti le centre de fin du clavier en système de coordonnées de ma vue en utilisant ce code [self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow]. Ce morceau de code a fonctionné et a donc résolu mon problème. Cependant, la question reste de savoir pourquoi il ne donne pas les coordonnées appropriées de scrollView.Origin.So, en gros, j'ai obtenu une solution de contournement en convertissant le clavier endcenter au lieu de scrollView.Origin. Oh, et je faisais tout cela pour calculer la nouvelle hauteur de mon scrollView lorsque le clavier apparaît à l'écran. Donc, si quelqu'un a une solution à ce problème ou une meilleure solution, veuillez nous le faire savoir.

10
Nishit

Il semble que vous ne convertissiez pas les vues appropriées. Le cadre d'une vue est défini sur les coordonnées de sa vue d'ensemble, et non sur ses propres coordonnées internes, donc si vous essayez de convertir l'origine d'une vue en coordonnées de fenêtre, vous devez utiliser la vue d'ensemble:

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

Cependant, il est encore plus simple de convertir le point zéro de la vue elle-même en fenêtre. Les deux morceaux de code sont équivalents, il n'est donc pas nécessaire d'utiliser l'origine du tout.

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

Notez que ces fonctions ne fonctionneront qu'une fois que le contrôleur de vue aura terminé de disposer les sous-vues. Donc, si vous le souhaitez lors du chargement de la vue, vous pouvez utiliser viewDidLayoutSubviews/viewDidAppear, mais pas dans viewDidLoad/viewWillAppear etc ...

Ce code a fonctionné pour moi:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

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

Swift 2.1:

Dans viewDidAppear (sinon les éléments ne sont pas encore en couches) de votre ViewController:

        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