UISlider più grande ok ma problema di localizzazione
Domanda
Il mio obiettivo è quello di creare un UISlider più grande con un'altezza di 35 pixel per l'immagine del pollice.
Ho sottoclassato UISlider e ho aggiunto il metodo:
- (CGRect)trackRectForBounds:(CGRect)bounds
{
return CGRectMake(bounds.origin.x, bounds.origin.y, self.bounds.size.width, 50);
}
Quindi ho impostato l'immagine thum dal mio controller usando setThumbImage:
Il mio pollice più grande è ben mostrato.
Il problema che ho è che la zona di tracciamento è sempre la stessa di circa 19 px di altezza, come estenderla a 50?
Grazie
T.
Soluzione
Credo che potresti voler guardare thumbRectForBounds:trackRect:value:
Altri suggerimenti
Un problema di vecchia data con il controllo UISlider del sistema operativo iPhone è che non puoi renderlo più alto. Più specificamente, puoi renderlo più alto specificando immagini più alte per il pollice e la traccia, ma l'area del tocco rimane alta fino a 23 pixel.
Michael Patricios ha pubblicato un modo per rendere i cursori predefiniti molto più facili da toccare e una variante di tale tecnica può gestire cursori più grandi. Quello che devi fare è sottoclassare UISlider e sovrascrivere pointInside nella tua classe:
// How many extra touchable pixels you want above and below the 23px slider
#define SIZE_EXTENSION_Y 10
- (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent*)event {
CGRect bounds = self.bounds;
bounds = CGRectInset(bounds, 0, SIZE_EXTENSION_Y);
return CGRectContainsPoint(bounds, point);
}
In Interface Builder, imposta il dispositivo di scorrimento per utilizzare la tua nuova sottoclasse UISlider e ora hai un dispositivo di scorrimento con un'altezza tangibile di 43px.
Sto usando questa soluzione :)
CGRect sliderFrame = self.mySlider.frame;
sliderFrame.size.height = 142.0;
[self.mySlider setFrame:sliderFrame];
Aumenta l'area colpita dal pollice di UISlider aumentando l'altezza del frame UISlider. Questo approccio evita qualsiasi offset e la conseguente necessità di correggere il frame del dispositivo di scorrimento.
- (void)viewDidLoad{
[super viewDidLoad];
//expand slider hit area
self.slider.frame = CGRectInset(self.slider.frame, 0, -10);
}