2010-04-01 8 views
4

Existe-t-il une méthode pour définir des graduations pour UISlider. NSSlider a quelque chose appelé - (void)setNumberOfTickMarks:(NSInteger)numberOfTickMarks. Mais UISlider ne semble pas en avoir un. Ce que je veux faire est obtenir les valeurs de curseur comme 0,1,2,3,4 etc si dis je mets le min comme 0 et max comme 5. Maintenant comme tel UISLider renvoie quelque chose comme 0.0,0.1,0.2 , 0,3 etc 4,8,4,9,5,0 sur la base de l'exemple que j'ai donné ci-dessus.Définition des graduations pour UISlider

Une aide?

Répondre

0

Je viens de lancer [slider value] à int pour y parvenir.

+1

à un casting int effectuera troncature sur la valeur, et ainsi une valeur comme 0,99 deviendra 0. Arrondi au plus proche entier sera un meilleur option. – Jasarien

+0

Merci pour vos réponses et le temps ... En fait, ce que je fais est de personnaliser mon curseur et de mettre une bande d'image comme l'image de la piste sur le curseur. Donc, lorsque mon curseur glisse, une image différente est sélectionnée. donc à 0, une image, 1 une autre image, 2 une autre image ... comme ça ... Mais maintenant, depuis le curseur se déplace de 0.1 à> 0.2 etc ... Rien ne se passe à ce moment-là. En fait, je ne veux pas ça. NSSLider fait exactement ce que je veux. Toute solution de contournement pour cela. –

5

UISlider n'a pas de pointage.

Pour obtenir le comportement que vous spécifiez, vous devez arrondir le nombre renvoyé par le curseur à l'entier le plus proche.

Ainsi, lorsque vous commencez à glisser, et le curseur fait état d'une valeur de 0,1 ou 0,2, rond que sur 0. jusqu'à ce qu'il atteigne 0,5, lorsque vous arrondissez à 1.

Ensuite, lorsque le curseur cesse de glisser, vous peut définir sa valeur au nombre que vous avez arrondi à, ce qui rendra le curseur "accrocher" à cette position, comme si l'on accrochait à une coche.

Si vous voulez des repères visuels, vous devrez l'implémenter vous-même.

+0

Merci pour vos réponses et votre temps ... En fait, ce que je fais est de personnaliser mon curseur et de mettre une bande d'image comme l'image de la piste sur le curseur. Donc, lorsque mon curseur glisse, une image différente est sélectionnée. donc à 0, une image, 1 une autre image, 2 une autre image ... comme ça ... Mais maintenant, depuis le curseur se déplace de 0.1 à> 0.2 etc ... Rien ne se passe à ce moment-là. En fait, je ne veux pas ça. NSSLider fait exactement ce que je veux. Toute solution de contournement pour cela. –

+0

'UISlider' n'est pas un port direct de' NSSlider', donc il semble que vous devrez sous-classer 'UISlider' et implémenter le comportement vous-même. – Jasarien

3

Oui, je pense que le sous-classement est la voie à suivre. Voilà ce que je l'ai fait:

TickSlider.h ...

/** 
* A custom slider that allows the user to specify the number of tick marks. 
* It behaves just like the NSSlider with tick marks for a MacOS app. 
**/ 
@interface TickSlider : UISlider 

/** 
* The number of tickmarks for the slider. No graphics will be draw in this 
* sublcass but the value of the slider will be rounded to the nearest tick 
* mark in the same way/behaviour as the NSSlider on a MacOS app. 
* @discussion This value can be set as a UserDefinedAttribute in the xib file. 
**/ 
@property (nonatomic) NSInteger numberOfTickMarks; 

@end 

TickSlider.m ...

#import "TickSlider.h" 

@implementation TickSlider 



- (void)setValue:(float)value animated:(BOOL)animated { 
    float updatedValue = value; 

    if (self.numberOfTickMarks > 0) { 
     updatedValue = MAX(self.minimumValue, MIN(value, self.maximumValue)); 

     if (self.numberOfTickMarks == 1) { 
      updatedValue = (self.minimumValue + self.maximumValue) * 0.5f; 
     } 
     else { 
      const int kNumberOfDivisions = (self.numberOfTickMarks - 1); 
      const float kSliderRange = ([self maximumValue] - [self minimumValue]); 
      const float kRangePerDivision = (kSliderRange/kNumberOfDivisions); 
      const float currentTickMark = roundf(value/kRangePerDivision); 
      updatedValue = (currentTickMark * kRangePerDivision); 
     } 
    } 

    [super setValue:updatedValue animated:animated]; 
} 


@end 
1

Comme ci-dessus, à int rend le curseur se comportent comme si vous où glisser à côté de la pouce. Le code ticker ci-dessus est intéressant, vous permettant de spécifier plus de "valeurs d'arrêt" (ticks) comme paramètre de valeur maximum.

Si vous avez besoin d'un simple "curseur entier", arrondir (valeur + 0.25) rend le curseur très bien. Voici le code que j'utilise:

@interface IntegerSlider : UISlider 
@end 

@implementation IntegerSlider 

- (void) setValue: (float) value 
     animated: (BOOL) animated 
{ 
    value = roundf(value + 0.25); 

    [super setValue: value 
      animated: animated]; 
} 

@end