2009-04-25 19 views
19

Mam subview UIButton wewnątrz UITableViewCell.Zmiana stanu opóźnionego UIButton

Po dotknięciu tego przycisku użytkownik musi przytrzymać przycisk przez około pół sekundy, aby zmienić obraz przycisku na obraz UIControlStateHighlighted.

Oznacza to, że jeśli użytkownik po prostu dotknie przycisku, jak zwykle, podświetlony stan nigdy nie zostanie wyświetlony.

Dlaczego tak się dzieje i jak mogę to naprawić?

+0

Z ciekawości, czy jest to w Symulatorze czy na urządzeniu? –

Odpowiedz

0

Edit: całkowicie ponownie napisany po nieporozumieniu pytania

Jednym ze sposobów myślenia o UIButton jest jako uproszczony sposób zakładania obszar ekranu, który może odpowiedzieć na różnych chwilowych zdarzeń dotykowych odpowiedzi jest definiowany przez system docelowej akcji UIControl do dostarczania wiadomości do innych obiektów.

UIControlEventTouchDown brzmi jak ten, na który należy odpowiedzieć. Zostanie on uruchomiony, gdy tylko ktoś dotknie twojego przycisku - tak właśnie działa przycisk "Informacje kontaktowe" w SMS.

UIButton * myButton = [[przycisk UIButtonWithType: UIButtonTypeRoundedRect]; // Podaj tytuł, ramkę itp. [myButton addTarget: self action: @selector (myButtonWasPressed) forControlEvents: UIControlEventTouchDown]; [myMainView addSubView: myButton];

Wysyła wiadomość o nazwie -(void)myButtonWasPressed do obiektu, z którego ten kod jest uruchamiany (najlepiej do kontrolera). W myButtonWasPressed możesz dodać nowy widok lub wykonać dowolne działanie. Aplikacja SMS przesuwa kontroler widoku, aby wyświetlić dane kontaktowe za pomocą kontrolera nawigacyjnego.

Jeśli to nadal nie rozwiązuje problemu, musisz opublikować kod, aby uzyskać lepszy wgląd w to, co dzieje się nie tak.

+0

Myślę, że źle rozumiesz. Jeśli na przykład patrzysz na aplikację SMS, ikony na górze wątku wiadomości reagują natychmiast na dotknięcia. Mówię, że moje przyciski nie pokazują natychmiastowej reakcji na podświetlony stan. Nie chcę, aby użytkownik przytrzymał przycisk. Chcę, aby używać normalnie przycisku, ale jego stan zmienia się i odbija się w wyglądzie przycisku zgodnie z oczekiwaniami. –

+0

Okay nadal jest nieporozumienie :). Nie ma nic złego w działaniach lub wydarzeniach z mojego przycisku. Aby odtworzyć to, co opisuję, po prostu utwórz nową UITableViewCell i dodaj UIButton jako jej podskok: to jest [cell.contentView addSubview: button]. Następnie przetestuj go na urządzeniu. Po dotknięciu przycisku akcja zostanie uruchomiona poprawnie, jednak podświetlony przycisk nie pojawi się natychmiast. Zamiast tego musisz przytrzymać przycisk na pół sekundy, zanim zobaczysz przycisk * wizualnie * zmień stan. Wszystko, o czym mówię, to wizualny wygląd przycisku. –

10

Problem polega na tym, że twój UIButton znajduje się wewnątrz UITableView. Oznacza to, że widok tabeli musi określać, czy Twój kran ma być przesunięciem palca, czy tylko dotknięciem przycisku przeznaczonym dla przycisku. Widok tabeli musi opóźnić wysyłanie wiadomości do UIButton, dopóki nie będzie wiedział, że użytkownik nie zamierza przesuwać palcem, a zatem przewija widok zamiast naciskać przycisk.

Jeśli nie potrzebujesz widoku tabeli, pozbądź się UITableView.

+0

Widzę to również i moim jedynym problemem z tym komentarzem jest to, że użycie innej kontrolki, takiej jak UISwitch, nie powoduje takiego opóźnienia. – d2burke

3

prostu zmienić obraz z wnętrza metody działania cel:

[sender setBackgroundImage:[UIImage imageNamed:@"highlighted-image.png"] forState:UIControlStateNormal]; 

Zmienia obraz tła natychmiast.

+0

działa, dziękuję! –

25

Po prostu napotkałem ten problem i zobaczyłem, że ten problem nie został zamknięty. Wkręcając się przez chwilę, znalazłem dla niego poprawkę.

Teraz możesz to naprawić, wyłączając opóźnieniaContentTouches lub odznaczając pole "Opóźnienia zawartości" w widoku tabeli.

Jedynym negatywnym efektem ubocznym jest to, że użytkownik nie będzie mógł nacisnąć przycisku i zainicjować gestu przewijania. Jeśli jednak użytkownik spróbuje przewinąć zaczynając od dowolnego miejsca, które samo nie akceptuje dotknięć, zachowanie powinno być takie samo jak poprzednio.

+0

Spędziłem prawdopodobnie 8 godzin próbując znaleźć rozwiązanie tego problemu. Dziękuję bardzo. – maxhud

+0

Miałem ten sam problem z UIButton na przewijanie. To naprawiło to. –

+0

To działa dla mnie, dzięki. –

10

Dotyczy odpowiedzi Davida Hodge'a.

Po prostu chcę dodać sposób, aby usunąć ten "tylko negatywny efekt uboczny", już opisany przez Davida: jeśli zaczniesz przewijać wewnątrz UIcontrol w UIScrollView z delayContentTouches = NO, przewijanie nie działa.

ROZWIĄZANIE podklasa UIScrollView (lub UITableView jako oryginalne pytanie) i zastąpić:

-(BOOL) touchesShouldCancelInContentView:(UIView *)view { 
return YES; 
} 

swoje UIControls wewnątrz UIScrollView/UITableView natychmiast zmieniają swój stan z beczki i scrollviews będą mogli przewinąć nawet jeśli dotknięcie zaczyna się na UIControl. Działa jak marzenie.

+0

Nigdy nie jest wywoływany. –

Powiązane problemy