web-dev-qa-db-fra.com

Comment placer le cadre d'une vue dans une autre vue?

J'ai un UIImageView dans le self.view (la vue principale) et à l'intérieur il y a un UIButton. Je veux savoir quel est le cadre de UIButton dans self.view pas dans UIImageView.

37
CrazyDev

Je suppose que vous cherchez cette méthode

- convertRect: toView:

// Swift
let frame = imageView.convert(button.frame, to: self.view)

// Objective-C
CGRect frame = [imageView convertRect:button.frame toView:self.view];
91
beryllium

Il existe quatre méthodes UIView qui peuvent vous aider, en convertissant CGPoints et CGRects d'une référence de coordonnées UIView en une autre:

– convertPoint:toView:
– convertPoint:fromView:
– convertRect:toView:
– convertRect:fromView:

pour que vous puissiez essayer

CGRect f = [imageView convertRect:button.frame toView:self.view];

ou

CGRect f = [self.view convertRect:button.frame fromView:imageView];
20
jbat100

Swift 3

Vous pouvez convertir le cadre du bouton en système de coordonnées de la vue avec ceci:

self.view.convert(myButton.frame, from: myButton.superview)


Assurez-vous de mettre votre logique dans viewDidLayoutSubviews et non viewDidLoad. Les opérations liées à la géométrie doivent être effectuées après la présentation des sous-vues, sinon elles risquent de ne pas fonctionner correctement.

class ViewController: UIViewController {

    @IBOutlet weak var myImageView: UIImageView!
    @IBOutlet weak var myButton: UIButton!

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        let buttonFrame = self.view.convert(myButton.frame, from: myButton.superview)
    }
}

Vous pouvez simplement référencer myButton.superview au lieu de myImageView lors de la conversion du cadre.


Voici plus d'options pour convertir un CGPoint ou CGRect.

self.view.convert(point: CGPoint, from: UICoordinateSpace)
self.view.convert(point: CGPoint, from: UIView)             
self.view.convert(rect: CGRect, from: UICoordinateSpace)
self.view.convert(rect: CGRect, from: UIView)

self.view.convert(point: CGPoint, to: UICoordinateSpace)
self.view.convert(point: CGPoint, to: UIView)
self.view.convert(rect: CGRect, to: UICoordinateSpace)
self.view.convert(rect: CGRect, to: UIView)

Voir Apple Developer Docs pour en savoir plus sur la conversion d'un CGPoint ou CGRect.

8
Derek Soike

Quelque chose comme ça? pourrait être totalement faux, à force d'y réfléchir; p

CGRect frame = CGRectMake((self.view.frame.Origin.x-imageview.frame.Origin.x) +btn.frame.Origin.x,
                          (self.view.frame.Origin.y.imageview.frame.Origin.y)+btn.frame.Origin.y,
                          btn.frame.size.width,
                          btn.frame.size.height);

Je ne sais pas s'il existe un moyen plus simple.

1
Rasmus Styrk