2015-10-17 1 views
0

Je teste un UIView en utilisant un UISlider comme dans l'exemple des images ci-dessous:Redimensionner une UIView, mais le dessin fait par drawRect aussi changer la taille

enter image description here

enter image description here

J'ai un UIView personnalisé avec un fond jaune qui dessine le carré gris, la méthode drawRect est comme ceci:

-(void)drawRect:(CGRect)rect{ 

    NSLog(@"Draw rect called"); 

    UIBezierPath* squarePath = [UIBezierPath bezierPathWithRect: CGRectMake(10, 10, 100, 100)]; 
    [UIColor.grayColor setFill]; 
    [squarePath fill]; 
} 

Et la méthode pour ma diapositive changement de valeur:

- (IBAction)changeValue:(id)sender { 

    CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, self.slider.value, self.slider.value); 
    self.tableView.transform = transform; 
    [self.tableView setNeedsDisplay]; 



} 

Je ne comprends pas pourquoi le carré devient plus grand. J'ai remarqué que drawRect est appelé chaque fois que le curseur est déplacé. Si cela arrive, pourquoi la taille du carré change-t-elle? Ne devrait-il pas rester de la même taille et juste le cadre croître avec le carré dans le coin supérieur gauche?

Ma deuxième question est, comment pourrais-je changer le code si juste le cadre se développe et la taille de dessin reste la même? Je pose cette question parce que je veux que la taille du dessin change dynamiquement en utilisant mon propre code dans drawRect.

Tous les pointeurs seraient vraiment appréciés! Merci!

Répondre

2

La raison pour laquelle la taille du carré change est parce que vous l'avez transformé. Les transformations n'affectent pas seulement le cadre d'une vue; ils affecteront le contenu. Le carré est dessiné dans son contexte à sa taille constante (100x100), puis la transformation l'étire avant de le rendre.

La raison pour laquelle il ne s'étend pas vers la droite et vers le bas est que, par défaut, le point d'ancrage d'une transformation est le centre des limites. Ainsi, l'échelle va du centre vers l'extérieur. De la documentation:

L'origine de la transformation est la valeur de la propriété centre ...

Les transformations ne sont pas destinés à être utilisés à l'échelle simplement la largeur et la hauteur de votre cadre. La propriété frame est pour cela. Stockez simplement le cadre de la vue dans une variable, changez sa largeur et sa hauteur, puis réglez-la. Dans votre code drawRect:, vous pouvez vérifier les dimensions du rectangle qui vous est donné et faire de la largeur/hauteur de votre carré un pourcentage de cela.