Je crée un sélecteur de couleur simple contrôlé par un contrôle de type curseur personnalisé.Comment optimiser UIColor sur l'iPhone?
Je transmets une valeur flottante de mon curseur à une méthode de constructeur UIColor et je mets à jour la couleur d'arrière-plan d'un CALayer lorsque la valeur change.
Il fonctionne très bien dans le simulateur, mais je me mets à scintiller lorsque je cours sur l'appareil. Est-ce juste parce qu'il est trop taxer le GPU? C'est étrangement le pire quand on passe au bleu. Et changer la valeur alpha et la luminosité scintillent plus que changer la saturation et la teinte.
Ne dois-je pas transmettre des valeurs flottantes arbitraires lorsque la valeur du curseur change? Si non, comment pourrais-je contraindre cela à moins de couleurs pour l'optimisation?
J'ai pensé à désactiver les animations implicites pour la propriété backgroundColor du CALayer, mais je ne suis pas sûr de savoir comment faire cela.
Y a-t-il des astuces pour optimiser les changements UIColor?
Mise à jour
Je ne suis pas en utilisant drawRect: ou drawInRect:
Je suis juste changer la propriété backgroundColor d'un CALayer. Chaque fois que touchesMoved: est appelée, j'attrape l'emplacement, crée une valeur flottante de 0.0 à 1.0 et envoie un message à mon délégué indiquant que la valeur a changé et appelle la méthode - (void) updateCurrentColor.
Voici un exemple de ma mise en œuvre:
@implementation MyCustomSliderView
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
hueLocation = [[touches anyObject] locationInView:self];
//Smoothing
if ((hueLocation.x > previousHueLocation.x) && ((hueLocation.x - previousHueLocation.x) > 1.0) && (hueLocation.x - previousHueLocation.x) < 10.0) {
hueLocation.x = previousHueLocation.x + 1.0;
}
if ((hueLocation.x < previousHueLocation.x) && ((previousHueLocation.x - hueLocation.x) > 1.0) && (previousHueLocation.x - hueLocation.x) < 10.0) {
hueLocation.x = previousHueLocation.x - 1.0;
}
//Percentage of screen.
hueValue = hueLocation.x/self.bounds.size.width;
//Clip to 1.0 & 0.0
if (hueValue > 1.0) {
hueValue = 1.0;
}
if (hueValue < 0.0) {
hueValue = 0.0;
}
NSLog(@"Value is: %f", hueValue);
NSLog(@"Location %f", hueLocation.x);
previousHueLocation = hueLocation;
if([delegate respondsToSelector:@selector(updateCurrentColor)]) {
[delegate updateCurrentColor];
}
}
@implementation MyViewController
- (void)updateCurrentColor {
currentColor = [UIColor colorWithHue:hueSliderView.hueValue
saturation:saturationSliderView.saturationValue
brightness:brightnessSliderView.brightnessValue
alpha:alphaSliderView.alphaValue];
colorLayer.backgroundColor = currentColor.CGColor;
}
Au début, je pensais qu'il était sauter des valeurs en raison de l'imprécision de l'interface tactile. La fonction de lissage a aidé, mais elle scintille encore, surtout avec la valeur alpha, même si ma position ne change que de 1 pixel. Dois-je limiter cela à une quantité limitée de couleurs/valeurs au lieu de simplement passer dans un flotteur arbitraire? Encore une fois, fonctionne très bien dans le simulateur, semble être juste un problème de performance.
Décrivez l'effet que vous obtenez. Existe-t-il des «barres» verticales/horizontales visibles où le changement est visible? Est-ce que les éléments disparaissent temporairement? Avez-vous une couleur de transition visible mais non désirée? – Artelius
Aucune barre. La couleur scintille de façon claire et sombre lorsque je change les valeurs (teinte, saturation, luminosité, alpha). Si je vais très lentement, c'est mieux, mais ça scintille parfois. J'ai ajusté la méthode touchesMouvées pour déplacer seulement un pixel à la fois à moins de passer au-dessus de 15. Cela m'a aidé. Toujours clignote cependant. –