2009-06-05 24 views
8

Kullanıyorum UIPickerView özel bir UIPickerView: UILabels UIPickerView'de vurgulanan seçimi geçersiz kılma

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

seçiciyi UILabels ile doldurmak için. Dokunduğunda seçili satırın vurgulanmasının davranışını devre dışı bırakmanın bir yolu var mı?

Bence bu UIPickerView'nın içinde yer alan UITableViewCell'in temelini oluşturan bir özelliktir ve bunu değiştirmenin bir yolunu bulamıyorum.

cevap

16

Sen özel görünümü aşağıdaki özelliklere sahip olduğundan emin olmak gerekir:

  1. O UIPickerView sizin temsilci yöntemlerine dayanan beklediğini aynı boyutlara boyutlandırılması gerekir - pickerView:rowHeightForComponent: ve pickerView:widthForComponent:. Özel bir yükseklik belirtmiyorsanız varsayılan yükseklik 44'tür.
  2. Arka plan rengi [UIColor clearColor] olmalıdır.
  3. Görünüm tüm dokunuşları yakalamalıdır.

bir gotcha özel görünüm olarak UILabel örneğini kullanarak olduğunu UILabel varsayılan userInteractionEnabled-NO (UIView, diğer taraftan, varsayılan YES Bu özellik).

Bu gereksinimlere dayanarak, Halle örnek kodu aşağıdaki gibi yeniden yazılabilir. Bu örnek, hızlı kaydırma performansı için gerekli olan önceden oluşturulmuş görünümleri de doğru bir şekilde yeniden kullanır.

- (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

Ben seçim geribildirim kaldırmak için kolay bir yol olup olmadığını sen emin değilim UIPickerView

+0

ShowSelectionIndicator, mavi çubuğun, seçici tarafından döndürülen değer üzerinde gösterilmesinden sorumludur. Maalesef alttaki UITableViewCell yapısıyla ilgisi yok. – Jon

0

ait "showsSelectionIndicator" özelliği bakmak isteyebilirsiniz sanırım, ama sen arka plan yaparsanız örtbas edebilir mavi seçim dikdörtgen aynı boyutlarda beyaz ve büyüklük etiketin:

- (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; 

} 

316 genişliği ile etiket her iki tarafındaki mavi bir şerit ama kapsar ve 320'de tamamen seçimi kapsar Geri bildirim ancak aynı zamanda sizi rahatsız edebilecek veya rahatsız etmeyecek olan dış tekerlek gradyanlarını da kapsamaktadır.

12

UILabelYES için düzeltmeleri vurgulayarak konu hakkındaki userInteractionEnabled özelliğinin ayarlanması, ama aynı zamanda dokundu satırı seçmek için autoscrolling dan UIPickerView devre dışı bırakır. Eğer vurgulama davranışı devre dışı, ama UIPickerView 'ın varsayılan autoscrolling işlevselliğini korumak istiyorsanız

, UIPickerView içerdiği UITableCell durumlarda setShowSelection işlevini çağırın. -

#import <UIKit/UIKit.h> 

@interface PickerViewLabel:UILabel 
{ 
} 

@end 

PickerViewLabel

PickerViewLabel.h: Bunu yapmanın bir yolu, aşağıdakine benzer UILabel sınıf alt sınıf olduğunu.m - O

#import "PickerViewLabel.h" 

@implementation PickerViewLabel 

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

@end 

, daha önce pickerView:viewForRow:forComponent:reusingView: içinde UILabel bir örneğini dönen olmuştu, PickerViewLabel bir örneğini döndürür. Örnek olarak, Doug kodunu kullanarak 'UILabel' ile 'PickerViewLabel' arasındaki tüm durumları değiştirirsiniz. Sadece pickerRowLabel.userInteractionEnabled = YES; satırını kaldırmayı unutmayın.

+0

Merhaba Christine, Yukarıdaki kodun aynısını uyguladım ama yine de mavi seçim seçili satırın her iki ucunda da geliyor. Kodu ayıklamaya çalıştığımda, didMoveToSuperview öğesinin hiçbir yerde çağrılmadığını buldum. Bana yardımcı olabilir misiniz? Teşekkürler. – engineer

+0

Hey Shailesh, Kodunuzu gördüğünüzde söylemek zor, ama neden çağrılmayacağına dair birkaç fikrim var. 'didMoveToSuperview', bir UIView'in bir görünümden eklendiği veya kaldırıldığı her zaman otomatik olarak çağrılan bir UIView işlevidir. Özel görünümünüz kesinlikle ekrana ekleniyor mu? Hızlı bir test yaparsanız ve sınıfınızın bir örneğini UIViewController'in görüşünün bir alt görünümü olarak eklerseniz, 'didMoveToSuperview' çağrıldığını görüyor musunuz? Değilse, işlev bildiriminde bir yerde bir yazım hatası olduğunu tahmin ediyorum. – Christine

+0

great .... çok teşekkürler ... hayatımı kurtardım ve çok zaman –