2009-09-16 6 views
10

Moim celem jest stworzenie większego UISlidera o wysokości 35 pikseli dla obrazu kciuka.większy UISlider ok ale problem ze strefą śledzenia

I podklasy UISlider i dodano metodę:

- (CGRect)trackRectForBounds:(CGRect)bounds 
{ 
    return CGRectMake(bounds.origin.x, bounds.origin.y, self.bounds.size.width, 50); 
} 

Potem ustawić obraz Thum z mojego kontrolera używając setThumbImage:

Mój większy kciuk jest dobrze wyświetlany.

Problem polega na tym, że strefa śledzenia jest wciąż taka sama na wysokości 19 px, jak ją rozszerzyć do 50?

Dzięki

T.

Odpowiedz

0

wierzę, że można zajrzeć do thumbRectForBounds:trackRect:value:

+2

Niestety, UISlider nie korzysta z funkcji powrotu z tej funkcji, aby określić obszar dotykowy suwaka. –

+0

jak wywołać metodę thumbRectForBounds, czy jest to metoda UISlider Delegate? –

31

Wieloletnia problem dotyczący kontroli UISlider iPhone OS”jest to, że nie można zrobić to wyższy . Bardziej konkretnie, możesz sprawić, by wyglądał na wyższy, określając wyższe obrazy dla jego kciuka i ścieżki, ale obszar dotykowy pozostaje mały jak 23 piksele.

Michael Patricios has published a way, aby domyślne suwaki były łatwiejsze do dotykania, a odmiany tej techniki mogą obsługiwać większe suwaki. Co trzeba zrobić, to podklasa UISlider i zastąpić pointInside w swojej klasie:

// 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); 
} 

interfejs Builder, ustaw suwak użyć nowego UISlider podklasy, i masz teraz suwak z 43px wysokości było dotykać.

+2

Mała poprawka: Myślę, że chcesz przekazać ujemną wartość SIZE_EXTENSION_Y do CGRectInset, aby zwiększyć rect. – Kelan

+3

Kelan jest poprawny, wartość -10 działa dobrze. –

+1

Dziękuję, dziękuję, dziękuję! Przy ustawieniu -10 to działało idealnie! Przez pewien czas próbowałem rozwiązać ten problem, a to działało pięknie. –

11

Używam tego rozwiązania :)

CGRect sliderFrame = self.mySlider.frame;  
sliderFrame.size.height = 142.0; 
[self.mySlider setFrame:sliderFrame]; 
+0

. Rozwiązanie to wydaje się o wiele prostsze niż rozwiązanie z @Allen Pike. Wydaje się też działać. Czy jest jakiś powód, dla którego jego odpowiedź jest bardziej pożądana niż twoja? – marcgg

+1

@marcgg Myślę, że to tylko dlatego, że dodałem swoją odpowiedź później ... – alexhajdu

+0

To działa, ale przesuwa suwak w pionie, ale jest to łatwe do naprawienia. –

8

Wzrost UISlider kciuk kierunkowy hitem zwiększając wysokość ramy UISlider. Takie podejście pozwala uniknąć przesunięcia i późniejszej potrzeby poprawienia ramki suwaka.

- (void)viewDidLoad{ 
    [super viewDidLoad]; 

    //expand slider hit area 
    self.slider.frame = CGRectInset(self.slider.frame, 0, -10); 

} 
+0

Ta odpowiedź jest znacznie łatwiejsza niż dwie powyższe. Działa świetnie. Dzięki! – chazzwozzer

+0

Niesamowite rozwiązanie – malaki1974

Powiązane problemy