2009-06-05 16 views
8

Mam zwyczaj UIPickerView gdzie używać:Zastępowanie podświetlone zaznaczenie w UIPickerView

-(UIView *)pickerView:(UIPickerView *)pickerView 
     viewForRow:(NSInteger)row 
    forComponent:(NSInteger)component 
     reusingView:(UIView *)view 

aby wypełnić próbnika z UILabels. Czy istnieje sposób wyłączenia zachowania podświetlania wybranego wiersza po dotknięciu?

Myślę, że jest to właściwość podstawowego UITableViewCell charakterystycznego dla UIPickerView i nie mogę znaleźć sposobu na jej zmianę.

Odpowiedz

16

Musisz upewnić się, że zwyczaj widok ma następujące właściwości:

  1. To musi być dobrane do tych samych wymiarach, że UIPickerView oczekuje opartych na metodach delegata - pickerView:rowHeightForComponent: i pickerView:widthForComponent:. Domyślna wysokość to 44, jeśli nie określasz niestandardowej wysokości.
  2. Kolor tła musi być [UIColor clearColor].
  3. Widok musi uchwycić wszystkie elementy.

Ten haczyka przy użyciu UILabel przypadków jako widoku niestandardowym jest UILabel domyślne userInteractionEnabled do NO (UIView, z drugiej strony, domyślnie dla tej właściwości YES).

W oparciu o te wymagania przykładowy kod z Halle można przepisać w następujący sposób. Ten przykład również poprawnie wykorzystuje wcześniej utworzone widoki, które są potrzebne do szybkiego przewijania wydajności.

- (UIView *)pickerView:(UIPickerView *)pickerView 
      viewForRow:(NSInteger)row 
      forComponent:(NSInteger)component 
      reusingView:(UIView *)view { 

    UILabel *pickerRowLabel = (UILabel *)view; 
    if (pickerRowLabel == nil) { 
    // Rule 1: width and height match what the picker view expects. 
    //   Change as needed. 
    CGRect frame = CGRectMake(0.0, 0.0, 320, 44); 
    pickerRowLabel = [[[UILabel alloc] initWithFrame:frame] autorelease]; 
    // Rule 2: background color is clear. The view is positioned over 
    //   the UIPickerView chrome. 
    pickerRowLabel.backgroundColor = [UIColor clearColor]; 
    // Rule 3: view must capture all touches otherwise the cell will highlight, 
    //   because the picker view uses a UITableView in its implementation. 
    pickerRowLabel.userInteractionEnabled = YES; 
    } 
    pickerRowLabel.text = [pickerDataArray objectAtIndex:row]; 

    return pickerRowLabel; 
} 
0

Chyba można zajrzeć do „showsSelectionIndicator” własność UIPickerView

+0

Element showSelectionIndicator jest odpowiedzialny za wyświetlanie niebieskiego paska nad wartością, która zostanie zwrócona przez selektor. To niestety nie ma nic wspólnego z podstawową strukturą UITableViewCell. – Jon

0

Nie jestem pewien, czy jest to prosty sposób, aby usunąć komentarze wyboru, ale można to zatuszować jeśli zrobisz tło etykiety białej i wielkości do tych samych wymiarach jak niebieski selekcji prostokąta:

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { 

    UILabel *pickerRowLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 316, 40)]; 
    pickerRowLabel.backgroundColor = [UIColor whiteColor]; 
    pickerRowLabel.text = [pickerDataArray objectAtIndex:row]; 
    [self.view addSubview:pickerRowLabel]; 

    return pickerRowLabel; 

} 

o szerokości 316 etykieta obejmuje wszystkich z wyjątkiem taśmy niebieskiego na każdej stronie, a w 320 całkowicie zakrywa wybór sprzężenie zwrotne, ale również zaczyna pokrywać trochę zewnętrznych gradientów koła, które mogą lub nie mogą przeszkadzać.

12

Ustawianie właściwości UILabel do YES rozwiązuje problem podkreślając userInteractionEnabled, ale również wyłącza UIPickerView z autoscrolling aby wybrać wiersz, który został dotknięty.

Jeśli chcesz wyłączyć zachowanie podświetlania, ale utrzymać funkcjonalność domyślne autoscrolling UIPickerView „s wywołać funkcję w UITableCell przypadkach zawartych w UIPickerViewsetShowSelection. Sposobem na to jest do podklasy klasy UILabel podobny do następującego:

PickerViewLabel.h -

#import <UIKit/UIKit.h> 

@interface PickerViewLabel:UILabel 
{ 
} 

@end 

PickerViewLabel.m -

#import "PickerViewLabel.h" 

@implementation PickerViewLabel 

- (void)didMoveToSuperview 
{ 
if ([[self superview] respondsToSelector:@selector(setShowSelection:)]) 
{ 
    [[self superview] performSelector:@selector(setShowSelection:) withObject:NO]; 
} 
} 

@end 

Następnie, w którym wcześniej powrocie wystąpienie UILabel w pickerView:viewForRow:forComponent:reusingView: powrócić instancję PickerViewLabel. Na przykład, używając kodu z Doug, zastąpisz wszystkie przypadki "UILabel" z "PickerViewLabel". Pamiętaj tylko, aby usunąć linię pickerRowLabel.userInteractionEnabled = YES;.

+0

Cześć Christine, Zaimplementowałem ten sam powyższy kod, ale nadal niebieski wybór pojawia się na obu końcach wybranego wiersza. Kiedy próbuję debugować kod, stwierdziłem, że didMoveToSuperview nie jest nigdzie wywoływany. Możesz mi pomóc? Dzięki. – engineer

+0

Hej Shailesh, Trudno powiedzieć, nie widząc swojego kodu, ale mam kilka pomysłów, dlaczego nie zostanie to wywołane. "didMoveToSuperview" jest funkcją funkcji UIView, która jest wywoływana automatycznie w dowolnym momencie, gdy UIView jest dodawany lub usuwany z widoku. Czy Twój niestandardowy widok jest z pewnością dodawany do ekranu? Jeśli wykonujesz szybki test i dodajesz instancję swojej klasy jako widok podrzędny widoku UIViewController, czy widzisz wtedy "didMoveToSuperview"? Jeśli nie, to zgaduję, że masz gdzieś literówkę w deklaracji funkcji. – Christine

+0

Świetnie .... bardzo dziękuję ... uratowałeś mi życie i dużo czasu –