UIButonul personalizat din interiorul unui UITableView continuă să fie evidențiat după ce a fost apăsat

Am implementat un UIButton personalizat, postat în cocoacontrols.com:

http://cocoacontrols.com/platforms/ios/controls/imageless-gradient-buttons

Tocmai am transformat proiectul în ARC și am setat butoanele. Ei lucrează, dar după ce au fost presați o singură dată, ei păstrează ei accentuate gradient.

Pentru a le seta, tocmai am schimbat clasa pe both storyboard și pe IBOutlets și am selectat gradientul pe care l-aș dori în ViewDidLoad.

Ai vreo idee despre ce ar putea fi problema?

EDIT: I've been spending more time with it and it appears to be that the problem only happens when the button is on a UITableView. It works OK when it is on a UIViewController

EDIT #2: according to the NSLogs, when the container is a UIViewController, the gradient is back to normal when a button is pressed:

2012-05-26 10:53:17.950 GradientButtons[11507:f803] highlighthed
2012-05-26 10:53:18.040 GradientButtons[11507:f803] highlighthed
2012-05-26 10:53:18.140 GradientButtons[11507:f803] Normal

dar când containerul este un UTableViewController, butonul rămâne cu gradientul înalt:

2012-05-26 10:55:20.969 GradientButtons[11507:f803] highlighthed
2012-05-26 10:55:21.069 GradientButtons[11507:f803] highlighthed

Am verificat viewContentMode și este același pentru toate butoanele, UIView și UITableView (Scale to fill). Schimbarea acesteia pentru redresare nu schimbă comportamentul.

2

1 răspunsuri

Există verificarea responsabilă pentru desenul gradient normal/evidențiat:

   if (self.state == UIControlStateHighlighted)
        gradient = self.highlightGradient;
    else
        gradient = self.normalGradient;

Trebuie să setați punctul de întrerupere sau să adăugați NSLog pentru a vedea dacă gradientul normal este selectat acolo. Dacă nu, pasul următor ar fi să înlocuiți codul normal drawRect adăugând jurnalul de stare. Utilizați-l în locul butoanelor colorate pentru a vedea dacă acesta este un comportament UIButton standard pentru tabelul dvs. (de exemplu, este posibil să mențineți celula evidențiată după ce butonul este apăsat, ceea ce face ca evidențierile să fie și ele evidențiate)


Bazându-vă pe jurnalul dvs. am găsit interesant și reprodus problema, pare a fi o condiție a cursei pentru ca statul evidențiat să fie prins la touchesEnded (încercați să țineți un clic pentru aproximativ o secundă - statul va fi normal la touchesEnded ). Motivul trebuie să fie investigat în continuare, ca soluție, puteți folosi următorul cod:

-(void) setHighlighted:(BOOL)highlighted
{
    NSLog(@"setHighlighted %@", highlighted ? @"Y": @"N");
    [super setHighlighted:highlighted];
    [self setNeedsDisplay];
}
2
adăugat
Am adăugat NSLog-urile. Se pare că atunci când butonul este pe un tabel, nu va reveni la normal după ce a fost apăsat.
adăugat autor Marcal, sursa
Voi încerca asta cât mai repede. Cu toate acestea, mai mult decât orice altceva, aș vrea să știu de ce se întâmplă doar în tabele. Am făcut o tastatură personalizată utilizând aceste butoane ca referință. Destul de curios, când tastatura personalizată este apelată pe o vizualizare de tabel, se comportă foarte normal. Nici o problema...
adăugat autor Marcal, sursa
Soluționarea funcționează frumos, multumesc mult. Aș fi frumos, totuși să aflu de unde provine această problemă. Multumesc din nou!
adăugat autor Marcal, sursa
Mulțumesc, este interesant, consultați actualizarea răspunsului.
adăugat autor A-Live, sursa
@Marcal acum când ați menționat-o din nou și am un proiect de probă pentru a testa, pot confirma aceeași problemă adăugând un buton pe UIView rădăcină, mai degrabă decât pe o celulă tableView. Trebuie să fie o problemă a implementării subclasării, nu văd nimic rău la soluția propusă până când nu doriți să o înlocuiți pe setNeedsDisplay și să schimbați evidențiat acolo. Cu toate acestea, ar putea exista alte probleme legate, aș dori, de asemenea, să înțeleagă sursa problemei pentru ao rezolva într-un mod mai bun.
adăugat autor A-Live, sursa
iOS dezvoltatori, România — Moldova
iOS dezvoltatori, România — Moldova
21 participanți

Parteneri: ciupacabra.com, @php_ro, @js_ro, @node_ro, @seo_ro Android: @ro_android