[iphone] 셀을 선택하면 UITableViewCell 서브 뷰가 사라짐

사용자가 10 가지 색상 중에서 선택할 수있는 색상 선택기 테이블보기를 구현하고 있습니다 (제품에 따라 다름). 사용자는 다른 옵션 (하드 드라이브 용량 등)을 선택할 수도 있습니다.

모든 색상 옵션은 자체 테이블 뷰 섹션 내에 있습니다.

실제 색상을 보여주는 textLabel 왼쪽에 작은 사각형을 표시하고 싶습니다.

지금은 간단한 사각형 UIView를 추가하고 다음과 같이 올바른 배경색을 지정합니다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RMProductAttributesCellID];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:RMProductAttributesCellID] autorelease];
        cell.indentationWidth = 44 - 8;

        UIView *colorThumb = [[[UIView alloc] initWithFrame:CGRectMake(8, 8, 28, 28)] autorelease];
        colorThumb.tag = RMProductAttributesCellColorThumbTag;
        colorThumb.hidden = YES;
        [cell.contentView addSubview:colorThumb];
    }

    RMProductAttribute *attr = (RMProductAttribute *)[_product.attributes objectAtIndex:indexPath.section];
    RMProductAttributeValue *value = (RMProductAttributeValue *)[attr.values objectAtIndex:indexPath.row];
    cell.textLabel.text = value.name;
    cell.textLabel.backgroundColor = [UIColor clearColor];

    UIView *colorThumb = [cell viewWithTag:RMProductAttributesCellColorThumbTag];
    colorThumb.hidden = !attr.isColor;
    cell.indentationLevel = (attr.isColor ? 1 : 0);

    if (attr.isColor) {
        colorThumb.layer.cornerRadius = 6.0;
        colorThumb.backgroundColor = value.color;
    }

    [self updateCell:cell atIndexPath:indexPath];

    return cell;
}

문제없이 잘 표시됩니다.

내 유일한 문제는 페이드 투 블루 선택 애니메이션 중에 “컬러”행을 선택할 때 내 사용자 정의 UIView (colorThumb)가 숨겨져 있다는 것입니다. 선택 / 선택 취소 애니메이션이 끝난 직후 다시 표시되지만 이로 인해 추악한 결과물이 생성됩니다.

이 문제를 해결하려면 어떻게해야합니까? 서브 뷰를 올바른 위치에 삽입하지 않습니까?

(didSelectRowAtIndexPath에는 특별한 것이 없으며 셀의 액세서리를 확인란으로 변경하거나 현재 indexPath를 선택 취소하면됩니다).



답변

UITableViewCell셀을 선택하거나 강조 할 때 재정의 tableview 세포의이 문제를 해결할 수있는, 모든 서브 뷰의 배경색을 변경 setSelected:animated하고 setHighlighted:animated볼의 배경 색상을 재설정.

목표 C에서 :

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
   UIColor *color = self.yourView.backgroundColor;
   [super setSelected:selected animated:animated];

    if (selected){
        self.yourView.backgroundColor = color;
    }
}

-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated{
    UIColor *color = self.yourView.backgroundColor;
    [super setHighlighted:highlighted animated:animated];

    if (highlighted){
        self.yourView.backgroundColor = color;
    }
}

스위프트 3.1에서 :

override func setSelected(_ selected: Bool, animated: Bool) {
    let color = yourView.backgroundColor
    super.setSelected(selected, animated: animated)

    if selected {
        yourView.backgroundColor = color
    }
}

override func setHighlighted(_ highlighted: Bool, animated: Bool) {
    let color = yourView.backgroundColor
    super.setHighlighted(highlighted, animated: animated)

    if highlighted {
        yourView.backgroundColor = color
    }
}


답변

테이블 뷰 셀은 강조 표시된 상태를 위해 컨텐츠 뷰 내의 모든 뷰의 배경색을 자동으로 변경하기 때문입니다. UIView색상을 그리거나 UIImageView사용자 정의 1×1 px 확장 이미지와 함께 사용하기 위해 서브 클래 싱 을 고려할 수 있습니다 .


답변

tableViewCell 선택 / 하이라이트 방법을 사용하는 대신 매우 우아한 솔루션을 찾았습니다. 배경색을 명확한 색으로 설정하는 것을 무시하는 UIView의 서브 클래스를 작성할 수 있습니다.

스위프트 3/4 :

class NeverClearView: UIView {
    override var backgroundColor: UIColor? {
        didSet {
            if backgroundColor != nil && backgroundColor!.cgColor.alpha == 0 {
                backgroundColor = oldValue
            }
        }
    }
}

스위프트 2 :

class NeverClearView: UIView {
    override var backgroundColor: UIColor? {
        didSet {
            if CGColorGetAlpha(backgroundColor!.CGColor) != 0 {
                backgroundColor = oldValue
            }
        }
    }
}

Obj-C 버전 :

@interface NeverClearView : UIView

@end

@implementation NeverClearView

- (void)setBackgroundColor:(UIColor *)backgroundColor {
    if (CGColorGetAlpha(backgroundColor.CGColor) != 0) {
        [super setBackgroundColor:backgroundColor];
    }
}

@end


답변

문제를 관리하는 또 다른 방법은 다음과 같이 핵심 그래픽 그래디언트로 뷰를 채우는 것입니다.

CAGradientLayer* gr = [CAGradientLayer layer];
gr.frame = mySubview.frame;
gr.colors = [NSArray arrayWithObjects:
                     (id)[[UIColor colorWithRed:0 green:0 blue:0 alpha:.5] CGColor]
                     ,(id)[[UIColor colorWithRed:0 green:0 blue:0 alpha:.5] CGColor]
                     , nil];

gr.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0],[NSNumber numberWithFloat:1],nil];

[mySubview.layer insertSublayer:gr atIndex:0];


답변

대한 스위프트 2.2 이 작품

cell.selectionStyle = UITableViewCellSelectionStyle.None

그리고 이유는 @ Andriy에 의해 설명됩니다

테이블 뷰 셀은 강조 표시된 상태를 위해 컨텐츠 뷰 내의 모든 뷰의 배경색을 자동으로 변경하기 때문입니다.


답변

Yatheesha BL
답변에서 영감을
얻어이
투명도 “기능”을 켜고 끌 수있는 UITableViewCell 범주 / 확장을 만들었습니다.

빠른

let cell = <Initialize Cell>
cell.keepSubviewBackground = true  // Turn  transparency "feature" off
cell.keepSubviewBackground = false // Leave transparency "feature" on

목표 -C

UITableViewCell* cell = <Initialize Cell>
cell.keepSubviewBackground = YES;  // Turn  transparency "feature" off
cell.keepSubviewBackground = NO;   // Leave transparency "feature" on

KeepBackgroundCell은 CocoaPods와 호환됩니다. GitHub에서 찾을 수 있습니다


답변

cell.selectionStyle = UITableViewCellSelectionStyleNone;다음에서 backgroundColor를 설정할 수 있습니다 .- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath