사용자가 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