【问题标题】:How can I change the color of the reorder accessory in a UITableViewCell?如何更改 UITableViewCell 中重新排序附件的颜色?
【发布时间】:2015-07-30 12:57:54
【问题描述】:

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

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

【问题讨论】:

标签: ios objective-c uitableview uiview


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    虽然我同意 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      相关资源
      最近更新 更多