web-dev-qa-db-fra.com

iOS - Obtenir l'emplacement d'une vue dans une fenêtre?

J'ai un UIView qui affiche une fenêtre contextuelle après avoir cliqué sur .. .. La fenêtre contextuelle doit être ajoutée à la fenêtre principale UIWindow pour être sûr qu'elle passe au-dessus de tout le reste.

Je souhaite que la position de cette fenêtre contextuelle soit relative à mon UIView. J'ai donc besoin de connaître l'emplacement relatif de mon UIView dans la fenêtre.

Question: Comment puis-je trouver l'emplacement d'un UIView dans une UIWindow lorsque UIView n'est pas directement dans la UIWindow (dans la vue de mon viewController)?

33
aryaxt

Use peut utiliser la méthode UIView covertRect: toView pour convertir le nouvel espace de coordonnées. J'ai fait quelque chose de très similaire:

// Convert the co-ordinates of the view into the window co-ordinate space
CGRect newFrame = [self convertRect:self.bounds toView:nil];

// Add this view to the main window
[self.window addSubview:self];
self.frame = newFrame;

Dans mon exemple, self est une vue qui est en train d'être supprimée de sa superView et ajoutée à la fenêtre située au-dessus de l'endroit où elle se trouvait. Le paramètre nil dans toView: signifie qu'il faut utiliser la fenêtre plutôt qu'une vue spécifique.

J'espère que cela t'aides,

Dave

64
Magic Bullet Dave

Vous pouvez demander à votre .superview de convertir votre Origin pour vous.

CGPoint originGlobal = [myView.superview convertPoint:myView.frame.Origin 
                                               toView:nil];
12
Yunus Nedim Mehel

Est-ce que convertPoint: toView: UIView ne fonctionne pas? Alors:

CGPoint windowPoint = [myView convertPoint:myView.bounds.Origin toView:myWindow];
8
Craig

Je devais le faire dans Xamarin.iOS

Pour ceux qui recherchent une solution, ce qui a finalement fonctionné pour moi a été:

CGRect globalRect = smallView.ConvertRectToView(smallView.Bounds, rootView);
6
Stoyan Berov

Ci-dessous, l'implémentation Xamarin.iOS a fonctionné pour moi.

    CGRect GetRectAsPerWindow(UIView view)
    {
        var window = UIApplication.SharedApplication.KeyWindow;
        return view.Superview.ConvertRectToView(view.Frame, window);
    }

Passez dans la vue dont vous voulez le cadre par rapport à Fenêtre.

0
soan saini