改变 UITableViewCell 中 UITableViewCellDeleteConfirmationControl(Delete Button) 的颜色
Posted
技术标签:
【中文标题】改变 UITableViewCell 中 UITableViewCellDeleteConfirmationControl(Delete Button) 的颜色【英文标题】:Changing the color of UITableViewCellDeleteConfirmationControl(Delete Button) in UITableViewCell 【发布时间】:2012-08-26 14:19:57 【问题描述】:目前我正在尝试自定义 UITableViewCell 中的 delte 按钮。 现在我得到了类似的东西:
现在,我只需要改变这个按钮的颜色,我不想改变行为,或者让它完全自定义。我确信这是可能的,无需创建自己的控件来删除 UITableView 中的行。
这是我的代码:
- (void)layoutSubviews
[super layoutSubviews];
for (UIView *subview in self.subviews)
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"])
UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
deleteButtonView.backgroundColor = [UIColor greenColor];
我该怎么做?
提前致谢!
【问题讨论】:
如果没有自定义 UITableViewCell 子类,我认为这是不可能的。为什么你确定有可能? @DrummerB 我读了很多关于自定义此按钮的内容,显然我的单元格是自定义的,我已经继承了 UITableViewCell,但我不明白如何简单地更改颜色,大多数时候人们想要更改此按钮的动画或整体视图。 @DrummerB 我不想改变任何行为,只想改变颜色。 我不知道有任何(记录在案的)方法可以访问该按钮。自定义它的唯一方法是设置它的文本。您可以尝试遍历单元格的所有子视图并尝试找到按钮(非常糟糕且不灵活的解决方案!)但即使您找到它, UIButton 也没有 tint 属性。您必须在您选择的图像编辑软件中创建有色可拉伸背景图像。 【参考方案1】:UITableViewCellDeleteConfirmationControl 不是公共类,你不能轻易改变它的外观。
为此,我相信您必须遍历单元格的子视图并更改其属性:
for (UIView *subview in self.subviews)
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl")
// Set the background using an image.
当然,你应该警惕做这种事情,因为它相当脆弱。我建议您自己滚动。
我建议 submitting a bug report 向 Apple 请求更轻松地编辑此内容的能力。
【讨论】:
但是我没有看到任何结果,即使我尝试添加按钮等子视图,它也不会这样做,但 UILabel 非常适合那里。【参考方案2】:在 UITableViewCell 子类中:
- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
for(UIView *subview in view.subviews)
if([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) return subview;
UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
if(recursiveResult) return recursiveResult;
return nil;
-(void)overrideConfirmationButtonColor
dispatch_async(dispatch_get_main_queue(), ^
UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self];
if(confirmationButton) confirmationButton.backgroundColor = [UIColor orangeColor];
);
然后在 UITableViewDelegate 中:
-(void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
<#Your cell class#> *cell = (<#Your cell class#>*)[self.tableView cellForRowAtIndexPath:indexPath];
[cell overrideConfirmationButtonColor];
这适用于 ios 7.1.2
【讨论】:
【参考方案3】:方法如下:
在滑动时激活删除按钮
//确保在uitableviewcontroller中有以下方法
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
return YES;
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
NSLog(@"You hit the delete button.");
设置自定义文本标签而不是删除。
-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
return @"Your Label";
为按钮第 1 部分设置自定义颜色 - 警告,这在技术上涉及到对私有苹果 API 的戳戳。但是,您不会被阻止使用作为 UIKIT 一部分的公共方法搜索来修改子视图。
创建一个 uitableviewcell 类(另见https://***.com/a/22350817/1758337)
- (void)layoutSubviews
[super layoutSubviews];
for (UIView *subview in self.subviews)
//iterate through subviews until you find the right one...
for(UIView *subview2 in subview.subviews)
if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"])
//your color
((UIView*)[subview2.subviews firstObject]).backgroundColor=[UIColor blueColor];
另一个注意事项:不能保证这种方法在未来的更新中有效。另请注意,提及或使用私有 UITableViewCellDeleteConfirmationView
类可能会导致 AppStore 拒绝。
为按钮第 2 部分设置自定义颜色
回到你的 uitableviewcontroller
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
[YourTableView reloadData];
(直到下次在 tablecell 上调用 layoutSubviews 时才会调用备用颜色,因此我们通过重新加载所有内容来确保发生这种情况。)
【讨论】:
【参考方案4】:silyevsk 的例子非常好......但是,六个月后,iOS 8 出现了,它不再完全正常工作了。
现在,您需要寻找一个名为“_UITableViewCellActionButton
”的子视图并设置它的背景颜色。
以下是我在我的应用程序中使用的 silyevsk 代码的修改版本。
在我的 一些UITableView
单元格上,我不希望用户能够滑动删除,但我确实想要一些东西(a挂锁图标)在他们滑动时出现。
为此,我在 UITableViewCell 类中添加了一个 bReadOnly
变量
@interface NoteTableViewCell : UITableViewCell
. . .
@property (nonatomic) bool bReadOnly;
-(void)overrideConfirmationButtonColor;
@end
我将 silyevsk 的代码添加到我的 .m 文件中:
- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
for(UIView *subview in view.subviews)
if([NSStringFromClass([subview class]) rangeOfString:@"UITableViewCellActionButton"].location != NSNotFound)
return subview;
UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
if(recursiveResult)
return recursiveResult;
return nil;
-(void)overrideConfirmationButtonColor
if (!bReadOnly)
return;
dispatch_async(dispatch_get_main_queue(), ^
UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self];
if(confirmationButton)
confirmationButton.backgroundColor = [UIColor lightGrayColor];
UIImageView* imgPadLock = [[UIImageView alloc] initWithFrame:confirmationButton.frame];
imgPadLock.image = [UIImage imageNamed:@"icnPadlockBlack.png"];
imgPadLock.contentMode = UIViewContentModeCenter; // Don't stretch the UIImage in our UIImageView
// Add this new UIImageView in the UIView which contains our Delete button
UIView* parent = [confirmationButton superview];
[parent addSubview:imgPadLock];
);
另外,我需要更改填充UITableView
的代码,否则会出现“删除”标签以及挂锁图标:
-(NSString*)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
Note* note = [listOfNotes objectAtIndex:indexPath.row];
if ( /* Is the user is allowed to delete this cell..? */ )
return @"Delete";
return @" ";
它仍然很丑陋,并且依赖于 iOS 9 出现时这不会完全改变的假设。
【讨论】:
【参考方案5】:这是解决方案:
- (void)layoutSubviews
[super layoutSubviews];
for (UIView *subview in self.subviews)
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"])
UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Background"]];
[deleteButtonView addSubview:image];
【讨论】:
这个方法需要针对iOS 7进行修改。见我上面的回答,还有***.com/a/22350817/1758337【参考方案6】:IOS7 兼容答案(不是创建自定义类,而是扩展 UITableViewCell :
@implementation UITableViewCell (customdelete)
- (void)layoutSubviews
[super layoutSubviews];
for (UIView *subview in self.subviews)
for(UIView *subview2 in subview.subviews)
if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"])
((UIView*)[subview2.subviews firstObject]).backgroundColor=COLOR_RED;
//YOU FOUND THE VIEW, DO WHATEVER YOU WANT, I JUST RECOLOURED IT
@end
【讨论】:
这种方法有效。您可能需要将此添加到 UITableViewController 以显示自定义颜色... - (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath [self.yourTableView reloadData];以上是关于改变 UITableViewCell 中 UITableViewCellDeleteConfirmationControl(Delete Button) 的颜色的主要内容,如果未能解决你的问题,请参考以下文章
UIbutton 未在 UITableViewCell 中更新其标记值