如何在UITableViewCell中更改重新排序附件的颜色?

时间:2015-07-28 17:29:32

标签: ios objective-c uitableview uiview

如何在UITableViewCell中移动重新排序附件,great answer。我希望将它保留在原处,但要改变颜色,因为我桌子的背景颜色不是白色。看起来我可以遵循下面显示的相同基本方法,但我不确定是否有更有效的方法来更改此编程绘制控件的颜色,而不仅仅是用程序化绘制的控件替换它拥有?

- (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
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您最好自己实施自定义重新排序附件,作为在UITableView进入编辑模式时滑入的自定义视图。

您提到的答案导航了内部UITableViewCell视图层次结构,并对UITableViewCellReorderControl等类名称进行了假设,这些类名称可能会在iOS的未来版本中发生变化并破坏您的代码。

答案 1 :(得分:0)

虽然我同意Antonis对iOS未来可能发生变化的担忧,但最终我采用了我在问题中描述的方法,只是在系统附件上重新绘制了不同颜色的附件。原因是这种观点伴随着拖动细胞的相互作用;如果我试图将其移除并自己绘制,我就无法移动细胞。我扩展了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);
}