사용자 정의 UITableViewCell 선택 스타일?


82

UITableViewCell클릭하면 셀을 클릭하면 배경 부분 (내 배경 이미지가 덮지 않는 영역)이 파란색으로 바뀝니다. 또한 UILabel클릭하면 셀의 모든 s가 흰색으로 바뀝니다.

그러나 내가 원하지 않는 것은 클릭했을 때 파란색 배경이지만 클릭 하면 셀 selectionstylenoneUILabels에 대해 강조 표시된 색상이 손실됩니다 .

그렇다면 셀을 클릭 할 때 파란색 배경을 제거하고 UILabels 의 강조 표시된 색상을 유지하는 방법이 있습니까?


답변:


174

다음과 같이 할 수 있습니다. 표 셀의 선택 스타일을 UITableViewCellSelectionStyleNone. 파란색 배경 강조 표시가 제거됩니다. 그런 다음 기본 UITableViewCell 클래스를 사용하는 대신 텍스트 레이블 강조 표시가 원하는 방식으로 작동하도록하려면의 하위 클래스를 만들고 강조 표시된 상태에 따라 원하는대로 레이블 색상을 설정하는 자체 구현 UITableViewCell으로의 기본 구현을 재정의합니다. setHighlighted:animated.

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

11
참고로 매개 변수를 사용 setHighlighted:animated:하는 을 재정의해야합니다 animated. 하나의 매개 변수 setHighlighted:메서드를 재정의하면 작동하지 않습니다.
Imre Kelényi

14
전화 [super setHighlighted:highlighted animated:animated];할까요?
SoftDesigner 2014-10-22

감사합니다! 매력처럼 작동합니다! 표준 강조 표시가 이상하기 때문에 원하는 경우 셀에서 다른 사용자 지정 뷰를 강조 표시 할 수 있습니다.
imike

2
그러나이 방법은 setHighlightedsetSelected. 먼저 셀을 선택하고 textColor가 흰색으로 변경된 다음 화면 시각적 부분에서 해당 셀을 스크롤 한 다음 뒤로 스크롤하여 textColor가 검은 색으로 바뀝니다
ronan

1
@jonkroll 개념을 이해했지만 내 요구 사항은 셀이 선택 될 때 해당 셀의 textLabel 색상이 selectedColor로 유지되어야한다는 것입니다. 바로 지금은 선택하는 동안 textLabel의 색상을 변경 한 후 선택 textLabel라는 원래의 색상에 남아
Samarth Kejriwal에게

75

iOS7 이전에 작업하는 경우 셀 선택 스타일을 없음으로 설정하십시오.

cell.selectionStyle = UITableViewCellSelectionStyleNone;

그렇지 않으면 그대로 두십시오. UITableViewCellSelectionStyleDefault

그때:

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

이 코드는 제대로 작동합니다.


2
@iBradApps ... 여기 당신은 UI를있는 tableview 셀의 사용자 정의 클래스 ... 생성되지 않습니다
알파

2
이에게 upvote에주기 - 그것은 아이폰 OS 7에서 선택된 셀의 텍스트가 아닌 색상을 변경하는 나를 위해 일한 유일한 해결책이다
베른 젠슨

1
selectionstyle이어야합니다 selectionStyle
braden

12
이 솔루션은 iOS7에서 작동했지만 selectionStyle을 UITableViewCellStyleDefault로 설정 한 후에 만 ​​작동했습니다.
Jay Q.

1
이 방법은 Apple의 "out of box"셀 선택 동작과 완전히 동일한 유일한 방법입니다. 받아 들여진 대답이어야합니다.
mkll 2014-06-30

16

선택 스타일을 없음으로 설정 한 후 다음 대리자 메서드를 사용할 수 있습니다.

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

여기에 다음과 같이 코드를 구현하십시오.

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

1
훌륭하고 깨끗한 솔루션! willDeselectRowAtIndexPath 호출을 구현하기 만하면 마법처럼 작동합니다!
Matej Balantič 2014 년

1
여기서 가능한 단점은 손가락이 선택한 셀을 떠날 때까지이 메서드가 호출되지 않는다는 것입니다. 다른 접근 방식은 셀을 터치하자마자 적용됩니다.
arlomedia

14

이 작업을 수행하려면 선택 스타일을로 설정 UITableViewCellSelectionStyleNone한 다음 setSelected:animated:원하는 결과를 얻기 위해 메서드 를 재정의해야합니다 . 파란색 (또는 회색) 선택을 볼 때 iOS의 자동 선택 메커니즘이 수행하는 것과 동일한 작업을 수행합니다.

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

UITableViewCell 배경을 변경하는 등 다른 방법으로이를 사용자 정의 할 수도 있습니다.


13

cellForRowAtIndexPath에서 다음 코드를 사용하십시오.

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

이것이 당신을 위해 일하기를 바랍니다.

코딩 즐기기 :)


이 답변은 맨 위에 있어야합니다. :)
Chintan Patel 2013 년

2
이것은 작동하지 않습니다. 만들려면 [cell.textLabel setHighlightedTextColor : [UIColor blueColor]]; 셀 selectionStyle은 NONE이 아니어야합니다.
Femina

6

의 하위 클래스에서 다음 함수를 재정의합니다 UITableViewCell.

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

감사합니다; 이것은 배경색을 변경할 때 화면 왼쪽 가장자리에서 오른쪽으로 전체 행을 선택하지 않는 유일한 것입니다.
Jose Ramirez

나는 setSelected 만 재정의하고 있었기 때문에 어떤 이유로 셀이 가끔 깜박이는 이유입니다.
Zonily Jame

3

표준 선택 스타일 동작을 일치시키기 위해 setHighlighted:animated:setSelected:animated:. 중복 코드를 피하기 위해 해당 코드를 공유 메서드로 옮기고 싶을 것입니다.

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

사용자 지정 셀에서 awakeFromNib 및 setSelected의 기본 구현을 재정의합니다.

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

또한 있는지 확인 선택 스타일 입니다 NOT 으로 설정 없음 .


0

내가 작동시킬 수있는 유일한 방법은 다음과 같습니다.

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

또한 contentView.alpha를 사용할 수 있습니다. 다음은 그 예입니다.

먼저 셀에 대한 선택 스타일을 설정합니다.

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

다음으로 사용자 지정 셀 클래스에서이 메서드를 애니메이션 예제로 재정의합니다.

  - (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;
        }];
    }
  }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.