답변:
나는 당신이 올바른 길을 가고 있다고 생각하지만 클래스 정의에 따르면 selectedBackgroundView
:
일반 스타일 테이블 (UITableViewStylePlain)의 셀은 기본값이 nil이고 섹션 그룹 테이블은 UITableViewStyleGrouped가 아닌 경우 기본값이 0입니다.
따라서 일반 스타일 테이블을 사용하는 경우 UIView
원하는 배경색을 가진 새 항목 을 할당 한 다음에 할당해야합니다 selectedBackgroundView
.
또는 다음을 사용할 수 있습니다.
cell.selectionStyle = UITableViewCellSelectionStyleGray;
셀을 선택할 때 원하는 모든 것이 회색 배경 인 경우 도움이 되었기를 바랍니다.
커스텀 셀이 필요 없습니다. 선택한 셀 색상 만 변경하려면 다음을 수행하십시오.
목표 -C :
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor redColor];
[cell setSelectedBackgroundView:bgColorView];
빠른:
let bgColorView = UIView()
bgColorView.backgroundColor = UIColor.red
cell.selectedBackgroundView = bgColorView
섹션 당 하나의 셀만있는 그룹화 된 테이블이있는 경우 코드에 다음 행을 추가하십시오.
bgColorView.layer.cornerRadius = 10;
UIView *bgColorView = [[UIView alloc] init];
[bgColorView setBackgroundColor:[UIColor redColor]];
bgColorView.layer.cornerRadius = 10;
[cell setSelectedBackgroundView:bgColorView];
[bgColorView release];
QuartzCore를 가져 오는 것을 잊지 마십시오.
스위프트 3 : 나를 위해 당신이 그것을 cellForRowAtIndexPath:
방법에 넣을 때 효과가있었습니다.
let view = UIView()
view.backgroundColor = UIColor.red
cell.selectedBackgroundView = view
awakeFromNib()
방법 (맞춤형 셀의 경우) 이라고 생각한다 .
다음은 iOS 8에서 작동합니다.
UITableViewCellSelectionStyleDefault
사용자 정의 배경색이 작동 하도록 선택 스타일을 설정 해야합니다. 다른 스타일이면 사용자 정의 배경색이 무시됩니다. 이전 답변이 스타일을 없음으로 설정해야하므로 동작에 변화가있는 것 같습니다.
셀의 전체 코드는 다음과 같습니다.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"MyCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// This is how you change the background color
cell.selectionStyle = UITableViewCellSelectionStyleDefault;
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor redColor];
[cell setSelectedBackgroundView:bgColorView];
return cell;
}
테이블 셀에 대한 사용자 정의 셀을 만들고 사용자 정의 셀 클래스에서 아래 코드를 입력하면 정상적으로 작동합니다. selectionBackground
UIImage에 원하는 컬러 이미지를 배치해야합니다 .
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
UIImage *selectionBackground = [UIImage imageNamed:@"yellow_bar.png"];
UIImageView *iview=[[UIImageView alloc] initWithImage:selectionBackground];
self.selectedBackgroundView=iview;
}
extension UITableViewCell {
var selectionColor: UIColor {
set {
let view = UIView()
view.backgroundColor = newValue
self.selectedBackgroundView = view
}
get {
return self.selectedBackgroundView?.backgroundColor ?? UIColor.clear
}
}
}
cell.selectionColor = UIColor.FormaCar.blue
@IBInspectable
원하는 경우 var에 추가하십시오 . @IBDesignable
이것에는 유용하지 않습니다.
셀에 사용자 정의 강조 표시 된 색상을 추가하고 셀에 버튼, 레이블, 이미지 등이 포함되도록하려면 다음 단계를 수행하십시오.
예를 들어 선택한 노란색을 원하는 경우 :
1) backgroundselectedView와 같이 20 % 불투명도 (노란색)로 모든 셀에 맞는 뷰를 만듭니다.
2) 셀 컨트롤러에서 다음을 작성하십시오.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
self.backgroundselectedView.alpha=1;
[super touchesBegan:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
self.backgroundselectedView.alpha=0;
[super touchesEnded:touches withEvent:event];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
self.backgroundSelectedImage.alpha=0;
[super touchesCancelled:touches withEvent:event];
}
사용자 정의 TableViewCell을 사용하는 경우 다음을 무시할 수도 있습니다 awakeFromNib
.
override func awakeFromNib() {
super.awakeFromNib()
// Set background color
let view = UIView()
view.backgroundColor = UIColor.redColor()
selectedBackgroundView = view
}
그룹화 된 테이블의 둥근 모서리 배경을 표시하는 Christian의 방법에 대한 팁 하나 더.
cornerRadius = 10
셀에 사용하면 네 모서리의 둥근 선택 배경이 표시됩니다. 테이블 뷰의 기본 UI와 동일하지 않습니다.
그래서 cornerRadius로 쉽게 해결할 수있는 방법에 대해 생각 합니다. 아래 코드에서 볼 수 있듯이 셀 위치 (위쪽, 아래쪽, 중간 또는 위쪽 아래쪽)를 확인하고 하나 이상의 하위 레이어를 추가하여 위쪽 또는 아래쪽 모서리를 숨 깁니다. 이것은 기본 테이블 뷰의 선택 배경과 정확히 동일한 모양을 보여줍니다.
이 코드를 iPad로 테스트했습니다 splitterview
. 필요에 따라 patchLayer의 프레임 위치를 변경할 수 있습니다.
동일한 결과를 얻는 더 쉬운 방법이 있으면 알려주십시오.
if (tableView.style == UITableViewStyleGrouped)
{
if (indexPath.row == 0)
{
cellPosition = CellGroupPositionAtTop;
}
else
{
cellPosition = CellGroupPositionAtMiddle;
}
NSInteger numberOfRows = [tableView numberOfRowsInSection:indexPath.section];
if (indexPath.row == numberOfRows - 1)
{
if (cellPosition == CellGroupPositionAtTop)
{
cellPosition = CellGroupPositionAtTopAndBottom;
}
else
{
cellPosition = CellGroupPositionAtBottom;
}
}
if (cellPosition != CellGroupPositionAtMiddle)
{
bgColorView.layer.cornerRadius = 10;
CALayer *patchLayer;
if (cellPosition == CellGroupPositionAtTop)
{
patchLayer = [CALayer layer];
patchLayer.frame = CGRectMake(0, 10, 302, 35);
patchLayer.backgroundColor = YOUR_BACKGROUND_COLOR;
[bgColorView.layer addSublayer:patchLayer];
}
else if (cellPosition == CellGroupPositionAtBottom)
{
patchLayer = [CALayer layer];
patchLayer.frame = CGRectMake(0, 0, 302, 35);
patchLayer.backgroundColor = YOUR_BACKGROUND_COLOR;
[bgColorView.layer addSublayer:patchLayer];
}
}
}
XIB 편집기는 다음과 같은 표준 옵션을 제공합니다.
섹션 : 파랑 / 회색 / 없음
(옵션이있는 오른쪽 열, 네 번째 탭, 첫 번째 그룹 "테이블보기 셀", 네 번째 하위 그룹, 세 항목 중 첫 번째 항목은 "선택"을 읽습니다)
올바른 표준 옵션을 선택하면 원하는 작업을 수행 할 수 있습니다.
에서 선택한 셀의 사용자 정의 색상에 UITableView
따라 Maciej Swic의 답변에 따라 훌륭한 솔루션
그것에 덧붙여서, 당신 은 일반적으로 아래의 셀 구성에서 Swic의 대답 을 선언합니다 :
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
또한 시스템 색상 대신 효과를 추가하려면 RGB 값을 사용하여 사용자 정의 색상 모양을 사용할 수 있습니다. 내 코드에서 이것은 내가 달성 한 방법입니다.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
}
static NSString *CellIdentifier = @"YourCustomCellName";
MakanTableCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell...
if (cell == nil) {
cell = [[[NSBundle mainBundle]loadNibNamed:@"YourCustomCellClassName" owner:self options:nil]objectAtIndex:0];
}
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor colorWithRed:255.0/256.0 green:239.0/256.0 blue:49.0/256.0 alpha:1];
bgColorView.layer.cornerRadius = 7;
bgColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView:bgColorView];
return cell;
}
그것이 당신에게도 효과가 있는지 알려주십시오. cornerRadius
선택한 셀의 모서리에있는 효과 의 숫자를 엉망으로 만들 수 있습니다 .
나는 선택 후가 아니라 터치에 대한 선택을 반영하는 다른 모든 사람들과 약간 다른 접근 방식을 가지고 있습니다. 하위 클래스 UITableViewCell이 있습니다. 터치 이벤트에서 배경색을 설정하면 터치시 선택을 시뮬레이션 한 다음 setSelected 함수에서 배경색을 설정하기 만하면됩니다. selSelected 함수에서 배경색을 설정하면 셀 선택을 해제 할 수 있습니다. 터치 이벤트를 수퍼에 전달하십시오. 그렇지 않으면 셀이 실제로 선택된 것처럼 작동하지 않습니다.
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.backgroundColor = UIColor(white: 0.0, alpha: 0.1)
super.touchesBegan(touches, withEvent: event)
}
override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) {
self.backgroundColor = UIColor.clearColor()
super.touchesCancelled(touches, withEvent: event)
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
self.backgroundColor = selected ? UIColor(white: 0.0, alpha: 0.1) : UIColor.clearColor()
}
모든 셀의 배경을 추가하려면 (Maciej의 답변 사용) :
for (int section = 0; section < [self.tableView numberOfSections]; section++) {
for (int row = 0; row < [self.tableView numberOfRowsInSection:section]; row++) {
NSIndexPath* cellPath = [NSIndexPath indexPathForRow:row inSection:section];
UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:cellPath];
//stuff to do with each cell
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor redColor];
[cell setSelectedBackgroundView:bgColorView];
}
}
기본적으로 선택된 회색 배경을 없애고 싶다면 다음 코드 줄을 cellForRowAtIndexPath func에 넣으십시오.
yourCell.selectionStyle = .None
스위프트 3.0 :
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = super.tableView(tableView, cellForRowAt: indexPath)
cell.contentView.backgroundColor = UIColor.red
}
나는 아래의 접근법을 사용하고 나를 위해 잘 작동합니다.
class MyTableViewCell : UITableViewCell {
var defaultStateColor:UIColor?
var hitStateColor:UIColor?
override func awakeFromNib(){
super.awakeFromNib()
self.selectionStyle = .None
}
// if you are overriding init you should set selectionStyle = .None
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let hitColor = hitStateColor {
self.contentView.backgroundColor = hitColor
}
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let defaultColor = defaultStateColor {
self.contentView.backgroundColor = defaultColor
}
}
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
if let defaultColor = defaultStateColor {
self.contentView.backgroundColor = defaultColor
}
}
}
표 셀 에 다음 줄 추가
let bgColorView = UIView()
bgColorView.backgroundColor = .red
self.selectedBackgroundView = bgColorView
마지막으로 아래와 같이되어야합니다
override func setSelected(_ selected: Bool, animated: Bool)
{
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
let bgColorView = UIView()
bgColorView.backgroundColor = .red
self.selectedBackgroundView = bgColorView
}
다음은 그룹화 된 테이블에 필요한 코드의 중요한 부분입니다. 섹션의 셀 중 하나를 선택하면 첫 번째 행의 색상이 변경됩니다. cellselectionstyle을 none으로 처음 설정하지 않으면 사용자가 row0을 클릭하면 셀이 bgColorView로 변경되고 bgColorView가 다시 사라지고 다시로드됩니다. 행운을 빕니다. 간단한 방법이 있는지 알려주세요.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
if ([indexPath row] == 0)
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UIView *bgColorView = [[UIView alloc] init];
bgColorView.layer.cornerRadius = 7;
bgColorView.layer.masksToBounds = YES;
[bgColorView setBackgroundColor:[UIColor colorWithRed:.85 green:0 blue:0 alpha:1]];
[cell setSelectedBackgroundView:bgColorView];
UIColor *backColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:1];
cell.backgroundColor = backColor;
UIColor *foreColor = [UIColor colorWithWhite:1 alpha:1];
cell.textLabel.textColor = foreColor;
cell.textLabel.text = @"row0";
}
else if ([indexPath row] == 1)
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UIColor *backColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
cell.backgroundColor = backColor;
UIColor *foreColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
cell.textLabel.textColor = foreColor;
cell.textLabel.text = @"row1";
}
else if ([indexPath row] == 2)
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UIColor *backColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
cell.backgroundColor = backColor;
UIColor *foreColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
cell.textLabel.textColor = foreColor;
cell.textLabel.text = @"row2";
}
return cell;
}
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:[indexPath section]];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
[cell setSelectionStyle:UITableViewCellSelectionStyleBlue];
[tableView selectRowAtIndexPath:path animated:YES scrollPosition:UITableViewScrollPositionNone];
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tvStat cellForRowAtIndexPath:indexPath];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}
#pragma mark Table view Gestures
-(IBAction)singleTapFrom:(UIGestureRecognizer *)tapRecog
{
CGPoint tapLoc = [tapRecog locationInView:tvStat];
NSIndexPath *tapPath = [tvStat indexPathForRowAtPoint:tapLoc];
NSIndexPath *seleRow = [tvStat indexPathForSelectedRow];
if([seleRow section] != [tapPath section])
[self tableView:tvStat didDeselectRowAtIndexPath:seleRow];
else if (seleRow == nil )
{}
else if([seleRow section] == [tapPath section] || [seleRow length] != 0)
return;
if(!tapPath)
[self.view endEditing:YES];
[self tableView:tvStat didSelectRowAtIndexPath:tapPath];
}
사용자 정의 셀 클래스의 경우. 무시하십시오.
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
if (selected) {
[self setBackgroundColor: CELL_SELECTED_BG_COLOR];
[self.contentView setBackgroundColor: CELL_SELECTED_BG_COLOR];
}else{
[self setBackgroundColor: [UIColor clearColor]];
[self.contentView setBackgroundColor: [UIColor clearColor]];
}
}
테이블 뷰 스타일이 평범한 경우 쉽지만 그룹 스타일에서는 약간 문제가 있습니다.
CGFloat cellHeight = [self tableView:tableView heightForRowAtIndexPath:indexPath];
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kGroupTableViewCellWidth+2, cellHeight)];
view.backgroundColor = kCommonHighlightedColor;
cell.selectedBackgroundView = view;
[view release];
UIRectCorner cornerFlag = 0;
CGSize radii = CGSizeMake(0, 0);
NSInteger theLastRow = --> (yourDataSourceArray.count - 1);
if (indexPath.row == 0) {
cornerFlag = UIRectCornerTopLeft | UIRectCornerTopRight;
radii = CGSizeMake(10, 10);
} else if (indexPath.row == theLastRow) {
cornerFlag = UIRectCornerBottomLeft | UIRectCornerBottomRight;
radii = CGSizeMake(10, 10);
}
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:cornerFlag cornerRadii:radii];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = maskPath.CGPath;
view.layer.mask = shapeLayer;
kGroupTableViewCellWidth를 지적하고 300으로 정의합니다 .iPhone의 그룹 테이블보기 셀 너비의 너비입니다.
override func setSelected(selected: Bool, animated: Bool) {
// Configure the view for the selected state
super.setSelected(selected, animated: animated)
let selView = UIView()
selView.backgroundColor = UIColor( red: 5/255, green: 159/255, blue:223/255, alpha: 1.0 )
self.selectedBackgroundView = selView
}
iOS 9.3을 사용하고 스토리 보드 또는 설정을 통해 색상을 설정해 cell.selectionStyle
도 효과가 없었지만 아래 코드는 작동했습니다.
UIView *customColorView = [[UIView alloc] init];
customColorView.backgroundColor = [UIColor colorWithRed:55 / 255.0
green:141 / 255.0
blue:211 / 255.0
alpha:1.0];
cell.selectedBackgroundView = customColorView;
return cell;
다음 코드를 시도하십시오.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[cellIdArray objectAtIndex:indexPath.row] forIndexPath:indexPath];
// Configure the cell...
cell.backgroundView =
[[UIImageView alloc] init] ;
cell.selectedBackgroundView =[[UIImageView alloc] init];
UIImage *rowBackground;
UIImage *selectionBackground;
rowBackground = [UIImage imageNamed:@"cellBackgroundDarkGrey.png"];
selectionBackground = [UIImage imageNamed:@"selectedMenu.png"];
((UIImageView *)cell.backgroundView).image = rowBackground;
((UIImageView *)cell.selectedBackgroundView).image = selectionBackground;
return cell;
}
// 빠른 버전 :
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell
cell.selectedBackgroundView = UIImageView()
cell.backgroundView=UIImageView()
let selectedBackground : UIImageView = cell.selectedBackgroundView as! UIImageView
selectedBackground.image = UIImage.init(named:"selected.png");
let backGround : UIImageView = cell.backgroundView as! UIImageView
backGround.image = UIImage.init(named:"defaultimage.png");
return cell
}
스위프트 4.x
선택 배경색을 anyColour로 변경하려면 Swift Extension을 사용하십시오.
아래와 같이 UITableView 셀 확장 만들기
extension UITableViewCell{
func removeCellSelectionColour(){
let clearView = UIView()
clearView.backgroundColor = UIColor.clear
UITableViewCell.appearance().selectedBackgroundView = clearView
}
}
그런 다음 셀 인스턴스로 removeCellSelectionColour () 를 호출 하십시오 .