110 votes

Est-il une UIView événement de redimensionnement?

J'ai une vue qui a des lignes et des colonnes de imageviews.

Si ce point de vue est redimensionnée, j'ai besoin de réorganiser la imageviews positions.

Ce point de vue est une sous-vue d'un autre point de vue qui est redimensionnée.

Est-il un moyen de détecter si ce point de vue est redimensionnée?

105voto

Michal Points 3353

Comme Uli a commenté ci-dessous, la bonne façon de le faire est d'écraser layoutSubviews et la mise en page de la imageViews.

Si, pour une raison quelconque, vous ne pouvez pas sous-classe et écraser layoutSubviews, en observant bounds devrait fonctionner, même en étant un peu sale. Pire encore, il y a un risque avec l'observation - Apple ne garantit pas que KVO fonctionne sur UIKit classes. Lire la discussion avec Apple ingénieur ici: Quand un objet associé à sortir?

réponse originale à cette question:

Vous pouvez utiliser la clé-valeur de l'observation:

[yourView addObserver:self forKeyPath:@"bounds" options:0 context:nil];

et de mettre en œuvre:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (object == yourView && [keyPath isEqualToString:@"bounds"]) {
        // do your stuff, or better schedule to run later using performSelector:withObject:afterDuration:
    }
}

34voto

gwang Points 170

Créer des sous-classe de UIView, et remplacer layoutSubviews

7voto

rekle Points 1138

Vous pouvez créer une sous-classe UIView et remplacer la

setFrame:(CGRect)cadre

la méthode. C'est la méthode appelée lorsque l'image (c'est à dire la taille) de la vue est changé. Faire quelque chose comme ceci:

- (void) setFrame:(CGRect)frame
{
  // Call the parent class to move the view
  [super setFrame:frame];

  // Do your custom code here.
}

7voto

Adlai Holler Points 604

Assez vieux, mais encore une bonne question. Apple, avec son exemple de code, et dans certains de leurs UIView sous-classes, elles remplacent setBounds à peu près comme:

-(void)setBounds:(CGRect)newBounds {
    BOOL const isResize = !CGSizeEqualToSize(newBounds.size, self.bounds.size);
    if (isResize) [self prepareToResizeTo:newBounds.size]; // probably saves 
    [super setBounds:newBounds];
    if (isResize) [self recoverFromResizing];
}

Primordial setFrame: n'est PAS une bonne idée. frame est dérivé de l' center, bounds, et transform, de sorte que iOS ne sera pas forcément setFrame:.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X