2010-06-28 21 views
19

UIButton wewnątrz UIScrollView nie strzela z kranu. Pomóż to rozwiązać.UIButton wewnątrz UIScrollView nie strzela z kranu

// Add a button 
UIButton *btn1 = [[UIButton buttonWithType:UIButtonTypeCustom] retain]; 
btn1.frame = CGRectMake(0, 0, 26, 18); 
btn1.bounds = CGRectMake(0, 0, 30.0, 30.0); 
[btn1 addTarget:self action:@selector(buttonClick1:) 
         forControlEvents:UIControlEventTouchUpInside]; 
[scrollView addSubview:btn1]; 


- (void)buttonClick1:(id)sender { 
    int dd = 4; 
} 
+0

Sprawdź wysokość lub szerokość scrollView, aby sprawdzić, czy jest 0, i włącz 'clipSubview' – onmyway133

Odpowiedz

15

znalazłem ten materiał:

Ale Scrollview będzie blokować akcenty z przycisku chyba ustawić userInteractionEnabled i właściwości exclusiveTouch do NO na Scrollview. Ale to mogłoby pokonać cel, jakim jest posiadanie przewijania wewnątrz jednego przycisku.

(Zobacz Can we put a UIButton in a UIScrollView and vice versa in iPhone)

Ale jak to zrobić?

Say masz UIScrollView * sv ... potem

sv.userInteractionEnabled = YES; 
sv.exclusiveTouch = YES; 

Chciałbym również dodać

sv.canCancelContentTouches = YES; 
sv.delaysContentTouches = YES; 
+0

Działa !!! Dziękuję Max. – echo

+0

canCancelContentUchwyty i opóźnieniaContentTouches są domyślnie TAK. ;) – Andy

+9

Nie działa dla mnie w iOS 7. –

10

Musisz ustawić zawartość rozmiar widoku. Musi być większy lub równy rozmiarowi zawartości scrollView.

Ponieważ domyślny rozmiar widoku to 320 x 480 (siatkówka 3.5 ") i 320 x 568 (siatkówka 4"). Tak więc zwiększenie wysokości widoku jako:

self.view.frame=CGRectMake(0, 0, 320, 700); 

Następnie dodanie tego jako podglądu twojego scrollView spowoduje przejście do rozwiązania.

6

OLD ODPOWIEDŹ: Wszystko co musiałem zrobić w iOS 7 został ustalony

[_scrollView setDelaysContentTouches:NO]; 

UPDATE: Po zrobieniu trochę więcej badań wynika, że ​​jeśli problem jest to, że UIButton kliknięcie wydaje się tylko nazywać się czasami, to jest właściwie pożądane zachowanie wewnątrz UIScrollView. A UIScrollView używa właściwości delaysContentTouches, aby automatycznie określić, czy użytkownik próbował przewinąć, czy też próbował nacisnąć przycisk wewnątrz widoku przewijania. Zakładam, że najlepiej nie zmieniać tego zachowania domyślnie na NO, ponieważ spowoduje to niemożność przewinięcia, jeśli palec użytkownika znajdzie się nad przyciskiem.

+0

dziękuję! to zasługuje na znacznie więcej uwagi !! –

4

byłem w obliczu tego samego problemu, co zrobiłem, było zamiast dodawania przycisku do widoku kontenera dodałem go do widoku przewijania na górze widoku kontenera:

scrollView.insertSubview(buttonA, aboveSubview: containerView) 

Moja struktura był:

-View 
--ScrollView 
---ContainerView 

Mam nadzieję, że może to być pomocne każdemu.

+0

Chciałbym wiedzieć, dlaczego tak naprawdę jest potrzebne .. jakiekolwiek wyjaśnienie? Dzięki za podpowiedź, rozwiązałeś mój problem. – alasker

+0

@alasker, szczerze mówiąc, nie mam wytłumaczenia, ale cieszę się, że wiem, że to ci pomaga. –

0

miałem taką samą strukturę jak odpowiedź Giovanny i używam snapkit. Mój problem polegał na tym, że mój ContainerView miał wysokość 0. Udało mi się to zauważyć, ustawiając ClipsToBounds = true na ContainerView (nic nie renderowało po wykonaniu tego, ponieważ granice miały wysokość 0).

Każdy widok poza granicami widoków rodzica nie otrzyma odświeżenia wewnątrz zdarzeń.

Moja poprawka polegała na ustawieniu lewej i prawej kotwy ContainerView równej View, a górnej równej ScrollView (górna część ScrollView jest przesunięta względem widoku głównego Roota).

Powiązane problemy