backgroundColor colorWithPatternImage finit par être étiré si la taille de la vue change, au lieu de répéter?

StackOverflow https://stackoverflow.com/questions/1418735

  •  07-07-2019
  •  | 
  •  

Question

Je définis un fond de vue sur une image répétée à l'aide de colorWithPatternImage. Si la taille de la vue change après que j'ai défini le fond pour la première fois, l'image est étirée au lieu d'être répétée pour la nouvelle taille - des idées pour résoudre ce problème?

Voici ce que je fais:

  • définir l'arrière-plan de la vue dans viewDidLoad:

    frameView.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @ "frame-repeat.png"]];

  • récupérez des informations sur le serveur, mettez à jour la vue, modifiez la taille de trame de la vue pour l'adapter au nouveau contenu (cela signifie généralement que la vue est plus haute)

  • l'image d'arrière-plan est maintenant étendue, même si je redéfinis la couleur d'arrière-plan en utilisant exactement le même code.

Si je ne fais pas le jeu d'arrière-plan initial et que je ne le définis qu'après avoir récupéré les données du serveur et modifié la taille de la vue, le résultat est magnifique: répétitions sans étirement. Cependant, cela signifie qu’il n’ya pas d’arrière-plan pendant le chargement des données ... semble moche.

Quelqu'un d'autre a-t-il rencontré ce problème?

Merci pour toute aide!

Était-ce utile?

La solution

La réponse est simple, il suffit d'appeler

[[self view] setNeedsDisplay];

dans le contrôleur lorsque vous modifiez la taille de l'image (ou où que vous fassiez, la ligne de fond consiste à envoyer un message setNeedsDisplay à la vue après la modification de l'image). Si cela ne fonctionne pas, essayez de définir la couleur d'arrière-plan.

Et si cela ne fonctionne pas, implémentez votre propre vue personnalisée et remplacez-la par la méthode

- (void) drawRect:(CGRect) rect {
   CGRect myBounds = self.bounds;
   CGContextRef context = UIGraphicsGetCurrentContext();
   [[UIColor colorWithPatternImage:[UIImage imageNamed:@"frame-repeat.png.png"]]set];
   CGContextFillRect(context, myBounds);
}

Ensuite, après le redimensionnement, envoyez setNeedsDisplay à votre vue. Cela fonctionnera à 100%.

J'espère que cela a été utile, Pawel

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top