如何更改 UITableViewCell 中重新订购配件的颜色?
How can I change the color of the reorder accessory in a UITableViewCell?
有一篇关于如何在 UITableViewCell 中移动重新排序附件的文章 great answer。我想将它保留在原处但更改其颜色,因为我的 table 的背景颜色不是白色。看起来我可以遵循下面显示的相同基本方法,但我不确定是否有更有效的方法来更改这个以编程方式绘制的控件的颜色,而不是用我自己的以编程方式绘制的控件替换它?
- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
for(UIView* view in cell.subviews)
{
if([[[view class] description] isEqualToString:@"UITableViewCellReorderControl"])
{
// the problem: change view color
}
}
}
您最好自己实现自定义重新排序附件,作为 UITableView
进入编辑模式时滑入的自定义视图。
您提到的答案导航内部 UITableViewCell
视图层次结构,并对 class 名称做出假设,例如 UITableViewCellReorderControl
,这可能会在 iOS 的未来版本中发生变化并破坏您的代码。
虽然我同意 Antonis 对 iOS 未来可能发生的变化的担忧,但我最终还是按照我在问题中描述的方法,简单地在系统配件上用不同的颜色重新绘制配件。原因是这个view自带拖拽cell的交互;如果我试图将其移除并自己绘制,我将无法移动单元格。我扩展了 MSCellAccessory 库。这是我的 willDisplayCell 方法:
- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
for(UIView* view in cell.subviews)
{
if([[[view class] description] isEqualToString:@"UITableViewCellReorderControl"])
{
MSCellAccessory *overlayControl = [MSCellAccessory accessoryWithType:FLAT_REORDER_CONTROL color:[UIColor colorWithRed:0.353 green:0.153 blue:0.035 alpha:1.0]];
[overlayControl setFrame:CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height)];
[view addSubview:overlayControl];
}
}
}
这是我对 MSCellAccessory.m 的扩展:
#define FLAT_REORDER_CONTROL_START_X CGRectGetMinX(self.bounds)+15
#define FLAT_REORDER_CONTROL_END_X CGRectGetMaxX(self.bounds)-15
#define FLAT_REORDER_CONTROL_STROKE_1_Y 19
#define FLAT_REORDER_CONTROL_STROKE_2_Y 22.5
#define FLAT_REORDER_CONTROL_STROKE_3_Y 26
#define FLAT_REORDER_CONTROL_STROKE_WIDTH 2
和
} else if(_accType == FLAT_REORDER_CONTROL) {
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextMoveToPoint(ctx, FLAT_REORDER_CONTROL_START_X, FLAT_REORDER_CONTROL_STROKE_1_Y);
CGContextAddLineToPoint(ctx, FLAT_REORDER_CONTROL_END_X, FLAT_REORDER_CONTROL_STROKE_1_Y);
CGContextMoveToPoint(ctx, FLAT_REORDER_CONTROL_START_X, FLAT_REORDER_CONTROL_STROKE_2_Y);
CGContextAddLineToPoint(ctx, FLAT_REORDER_CONTROL_END_X, FLAT_REORDER_CONTROL_STROKE_2_Y);
CGContextMoveToPoint(ctx, FLAT_REORDER_CONTROL_START_X, FLAT_REORDER_CONTROL_STROKE_3_Y);
CGContextAddLineToPoint(ctx, FLAT_REORDER_CONTROL_END_X, FLAT_REORDER_CONTROL_STROKE_3_Y);
CGContextSetLineWidth(ctx, FLAT_REORDER_CONTROL_STROKE_WIDTH);
[self.accessoryColor setStroke];
CGContextStrokePath(ctx);
}
有一篇关于如何在 UITableViewCell 中移动重新排序附件的文章 great answer。我想将它保留在原处但更改其颜色,因为我的 table 的背景颜色不是白色。看起来我可以遵循下面显示的相同基本方法,但我不确定是否有更有效的方法来更改这个以编程方式绘制的控件的颜色,而不是用我自己的以编程方式绘制的控件替换它?
- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
for(UIView* view in cell.subviews)
{
if([[[view class] description] isEqualToString:@"UITableViewCellReorderControl"])
{
// the problem: change view color
}
}
}
您最好自己实现自定义重新排序附件,作为 UITableView
进入编辑模式时滑入的自定义视图。
您提到的答案导航内部 UITableViewCell
视图层次结构,并对 class 名称做出假设,例如 UITableViewCellReorderControl
,这可能会在 iOS 的未来版本中发生变化并破坏您的代码。
虽然我同意 Antonis 对 iOS 未来可能发生的变化的担忧,但我最终还是按照我在问题中描述的方法,简单地在系统配件上用不同的颜色重新绘制配件。原因是这个view自带拖拽cell的交互;如果我试图将其移除并自己绘制,我将无法移动单元格。我扩展了 MSCellAccessory 库。这是我的 willDisplayCell 方法:
- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
for(UIView* view in cell.subviews)
{
if([[[view class] description] isEqualToString:@"UITableViewCellReorderControl"])
{
MSCellAccessory *overlayControl = [MSCellAccessory accessoryWithType:FLAT_REORDER_CONTROL color:[UIColor colorWithRed:0.353 green:0.153 blue:0.035 alpha:1.0]];
[overlayControl setFrame:CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height)];
[view addSubview:overlayControl];
}
}
}
这是我对 MSCellAccessory.m 的扩展:
#define FLAT_REORDER_CONTROL_START_X CGRectGetMinX(self.bounds)+15
#define FLAT_REORDER_CONTROL_END_X CGRectGetMaxX(self.bounds)-15
#define FLAT_REORDER_CONTROL_STROKE_1_Y 19
#define FLAT_REORDER_CONTROL_STROKE_2_Y 22.5
#define FLAT_REORDER_CONTROL_STROKE_3_Y 26
#define FLAT_REORDER_CONTROL_STROKE_WIDTH 2
和
} else if(_accType == FLAT_REORDER_CONTROL) {
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextMoveToPoint(ctx, FLAT_REORDER_CONTROL_START_X, FLAT_REORDER_CONTROL_STROKE_1_Y);
CGContextAddLineToPoint(ctx, FLAT_REORDER_CONTROL_END_X, FLAT_REORDER_CONTROL_STROKE_1_Y);
CGContextMoveToPoint(ctx, FLAT_REORDER_CONTROL_START_X, FLAT_REORDER_CONTROL_STROKE_2_Y);
CGContextAddLineToPoint(ctx, FLAT_REORDER_CONTROL_END_X, FLAT_REORDER_CONTROL_STROKE_2_Y);
CGContextMoveToPoint(ctx, FLAT_REORDER_CONTROL_START_X, FLAT_REORDER_CONTROL_STROKE_3_Y);
CGContextAddLineToPoint(ctx, FLAT_REORDER_CONTROL_END_X, FLAT_REORDER_CONTROL_STROKE_3_Y);
CGContextSetLineWidth(ctx, FLAT_REORDER_CONTROL_STROKE_WIDTH);
[self.accessoryColor setStroke];
CGContextStrokePath(ctx);
}