web-dev-qa-db-fra.com

Comment détecter lorsque la taille UIView est modifiée dans Swift ios xcode?

J'essaie quelques trucs avec CATiledLayer dans UIScrollView.

D'une certaine manière, la taille de UIView à l'intérieur de UIScrollView est modifiée en grand nombre. J'ai besoin de savoir exactement ce qui cause ce redimensionnement.

Existe-t-il un moyen de détecter le redimensionnement de la taille de UIView (cadre, limites) ou contentSize de UIScrollView?

J'ai essayé

override var frame: CGRect {
    didSet {
        println("frame changed");
    }
}

à l'intérieur de la sous-classe UIView,

mais il n'est appelé qu'une seule fois lorsque l'application démarre, bien que la taille de UIView soit redimensionnée par la suite.

19
Joon. P

viewWillLayoutSubviews() et viewDidLayoutSubviews() seront appelés chaque fois que les limites changent. Dans le contrôleur de vue.

35
simons

Il y a une réponse ici:

https://stackoverflow.com/a/27590915/5160929

Collez-le simplement en dehors du corps d'une méthode:

override var bounds: CGRect {
    didSet {
        // Do stuff here
    }
}
29
bearacuda13

Vous pouvez également utiliser KVO:

Vous pouvez définir un KVO comme ceci, où view est le view que vous souhaitez observer les changements de trame:

self.addObserver(view, forKeyPath: "center", options: NSKeyValueObservingOptions.New, context: nil)

Et vous pouvez obtenir les modifications avec cette notification:

override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: NSDictionary!, context: CMutableVoidPointer) {
    }

observeValueForKeyPath sera appelé chaque fois que le cadre de la vue que vous observez change.

N'oubliez pas non plus de supprimer l'observateur lorsque votre vue est sur le point d'être désallouée:

view.removeObserver(self, forKeyPath:@"center")
5
Lefteris

Les réponses sont correctes, bien que dans mon cas, les contraintes que j'ai configurées dans le storyboard ont fait changer la taille d'UIView sans rappeler aucune fonction de détection.

2
Joon. P

ÉTAPE 1: viewWillLayoutSubviews

Appelé pour informer le contrôleur de vue que sa vue est sur le point de disposer ses sous-vues

Lorsque les limites d'une vue changent, la vue ajuste la position de ses sous-vues. Votre contrôleur de vue peut remplacer cette méthode pour apporter des modifications avant que la vue ne présente ses sous-vues. L'implémentation par défaut de cette méthode ne fait rien.

ÉTAPE 2: viewDidLayoutSubviews

Appelé pour informer le contrôleur de vue que sa vue vient de présenter ses sous-vues.

Lorsque les limites changent pour la vue d'un contrôleur de vue, la vue ajuste les positions de ses sous-vues, puis le système appelle cette méthode. Cependant, cette méthode appelée n'indique pas que les dispositions individuelles des sous-vues de la vue ont été ajustées. Chaque sous-vue est chargée d'ajuster sa propre mise en page.

Votre contrôleur de vue peut remplacer cette méthode pour apporter des modifications une fois que la vue présente ses sous-vues. L'implémentation par défaut de cette méthode ne fait rien.

Au-dessus de ces méthodes sont appelées chaque fois que limites de UIView est changé

1
user3182143