Özel UITableViewCell seçim stili?


83

Benim üzerime UITableViewCelltıkladığımda, hücreye tıkladığımda arka plan kısmı (arka plan resmimin kaplamadığı alanlar) maviye dönüyor. Ayrıca, UILabelhücredeki tüm e-postalar tıklandığında beyaza dönüyor ki bu da istediğim şey.

Ancak, istemediğim şey, tıkladığımda mavi arka plan ama bunu yaparsam selectionstylenone, UILabelhücredeki e'ler için vurgulanan renkleri kaybediyorum .

Öyleyse, hücreye tıklandığında mavi arka plandan kurtulmanın ancak s'lerin vurgulanan renklerini korumanın bir yolu var UILabelmı?


Yanıtlar:


174

Bunu aşağıdaki şekilde yapabilirsiniz. Tablo hücrenizin seçim stilini olarak ayarlayın UITableViewCellSelectionStyleNone. Bu, mavi arka plan vurgulamasını kaldıracaktır. Ardından, metin etiketi vurgulamanın istediğiniz şekilde çalışmasını sağlamak için, varsayılan UITableViewCell sınıfını kullanmak yerine, bir alt sınıf oluşturun UITableViewCellve setHighlighted:animatedvurgulanan duruma bağlı olarak etiket renklerini istediğiniz şekilde ayarlayan kendi uygulamanızın varsayılan uygulamasını geçersiz kılın. .

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    if (highlighted) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

11
Yan not olarak, parametreyi setHighlighted:animated:alan geçersiz kıldığınızdan emin olun animated. Tek parametreli setHighlighted:yöntemi geçersiz kılmak işe yaramayacaktır.
Imre Kelényi

14
Aramalı mıyız [super setHighlighted:highlighted animated:animated];?
SoftDesigner

Çok teşekkürler! Tıkır tıkır çalışıyor! Ve bu bana, eğer istersem, hücrede başka bir özel görünümü vurgulama konusunda kontrol sağlıyor, çünkü standart vurgulama bunu garip yapıyor.
imike

2
Ancak bu yöntem, geçersiz bir sorun var setHighlightedve setSelected. Önce bir hücre seçersiniz, tamam textColor beyaza dönüşür, sonra o hücreyi ekran görsel bölümünüzün dışına kaydırırsınız, sonra geri kaydırırsınız, bakın, textColor siyah olur
ronan

1
@jonkroll Kavramı anladım, ancak benim ihtiyacım, bir hücre seçildiğinde o hücrenin textLabel renginin selectedColor olarak kalmasıdır, şu anda seçim sırasında textLabel'in rengini değiştiriyor, bundan sonra seçili textLabel orijinal renkte kalıyor
Samarth Kejriwal

75

İOS7'den önce çalışıyorsanız, hücre seçim stilinizi hiçbiri yapmayın

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Aksi halde bırak UITableViewCellSelectionStyleDefault

Sonra:

UIView *selectedView = [[UIView alloc]init];
selectedView.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView =  selectedView;

Bu kod düzgün çalışacak


2
@iBradApps ... burada herhangi bir özel sınıf oluşturmuyorsunuz ... ui tableview hücresinden
Alfa

2
Buna bir olumlu oy vermek - iOS 7'de seçilen bir hücrenin metin olmayan rengini değiştirmek için benim için çalışan tek çözüm budur.
Vern Jensen

1
seçim
stili

12
Bu çözüm iOS7'de çalıştı, ancak yalnızca selectionStyle'ı UITableViewCellStyleDefault olarak ayarladıktan sonra.
Jay Q.

1
Bu yöntem, Apple'ın "kullanıma hazır" hücre seçimi davranışıyla tamamen aynı olan tek yöntemdir. Cevap kabul edilmelidir.
mkll

16

Seçim stilini yok olarak ayarladıktan sonra aşağıdaki temsilci yöntemlerini kullanabilirsiniz:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

Kodunuzu bunun gibi buraya uygulayın

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
    [cell.lbls setTextColor:[UIColor whiteColor]];
    return indexPath;
}

1
Harika ve temiz çözüm! Sadece willDeselectRowAtIndexPath çağrısını uygulamanız gerekir ve sihir gibi çalışır!
Matej Balantič

1
Buradaki olası bir dezavantaj, parmağınız seçilen hücreden çıkana kadar bu yöntemin çağrılmamasıdır; hücreye dokunduğunuz anda diğer bazı yaklaşımlar devreye girer.
arlomedia

14

Bu çalışmayı elde etmek için seçim stilini olarak ayarlamanız UITableViewCellSelectionStyleNoneve ardından istediğiniz setSelected:animated:sonucu elde etmek için yöntemi geçersiz kılmanız gerekir . Mavi (veya gri) seçimi gördüğünüzde iOS'un otomatik seçim mekanizmasının yaptığı aynı şeyi yapar.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if (selected) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

Bunu başka bir şekilde de özelleştirebilirsiniz, örneğin UITableViewCell arka planını vb. Değiştirerek.


13

CellForRowAtIndexPath'de şu kodu kullanın:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

[cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels

Umarım bu sizin için çalışacaktır.

Kodlamanın Keyfini Çıkarın :)


Bu cevabın üstte olması gerekiyor. :)
Chintan Patel

2
Bu işe yaramayacak. [Cell.textLabel setHighlightedTextColor: [UIColor blueColor]] yapmak istiyorsanız; Cell selectionStil HİÇBİRİ olmamalıdır.
Femina

6

Alt sınıfınızda aşağıdaki işlevleri geçersiz kılmak UITableViewCell.

override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }

Teşekkür ederim; arka plan rengini değiştirirken ekranın sol kenarından sağına kadar tüm satırın seçilmesine neden olmayan tek şey buydu.
Jose Ramirez

Ben sadece setSelected'ı geçersiz kılıyordum, bu yüzden hücre bazen hala yanıp sönüyordu.
Zonily Jame

3

Standart seçim tarzı davranışını eşleşecek için, hem geçersiz isteyeceksiniz setHighlighted:animated:ve setSelected:animated:. Yinelenen kodlardan kaçınmak için muhtemelen bu kodu paylaşılan bir yönteme taşımak isteyeceksiniz.

override func setHighlighted(highlighted: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(highlighted, animated: animated)
    super.setHighlighted(highlighted, animated: animated)
}

override func setSelected(selected: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(selected, animated: animated)
    super.setSelected(selected, animated: animated)
}

func setAsSelectedOrHighlighted(selectedOrHighlighted: Bool, animated: Bool) {

    let action = {
        // Set animatable properties
    }

    if animated {
        UIView.animateWithDuration(1.0, delay: 0, options: .CurveEaseInOut, animations: action, completion: nil)
    }
    else {
        action()
    }
}

1

Özel hücrenizde, awakeFromNib & setSelected'ın varsayılan uygulamasını geçersiz kılın:

- (void)awakeFromNib {
    // Initialization code
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.bounds];
    imageView.image = [UIImage imageNamed:@"cell_selected_img"];
    self.selectedBackgroundView = imageView;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
    if (selected) {
        self.lblCustomText.textColor = [UIColor whiteColor];
    } else {
        self.lblCustomText.textColor = [UIColor blackColor];
    }
}

Ayrıca emin seçim tarzı olduğu DEĞİL ayarlı Yok .


0

Çalışmasını sağlamamın tek yolu şuydu:

- (void)awakeFromNib {
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor colorWithRed:(55.0/255.0) green:(163.0/255.0) blue:(237.0/255.0) alpha:1.0];
    bgColorView.layer.masksToBounds = YES;
    self.selectedBackgroundView = bgColorView;
}

0

Ayrıca contentView.alpha'yı da kullanabilirsiniz. İşte örnek.

İlk olarak, hücreniz için seçim stilini ayarlayın:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Ardından, özel hücre sınıfında bu yöntemi animasyon örneğiyle geçersiz kılın:

  - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];

    if (highlighted) {
        [UIView animateWithDuration:0.15f animations:^{
            self.contentView.alpha = 0.5f;
        }];
    } else {
        [UIView animateWithDuration:0.35f animations:^{
            self.contentView.alpha = 1.f;
        }];
    }
  }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.