在选择时将子视图添加到UITableViewCell

时间:2014-05-21 14:28:17

标签: objective-c uitableview uiview didselectrowatindexpath

我正在尝试添加一个应该删除文本的UIView(不要担心水平错位)。

但是,在选择行时,会在下面添加几行。为什么呢?

Strange selection behaviour

这是我的代码:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%@", indexPath);

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    UILabel *label = cell.textLabel;

    CGSize textSize = [[label text] sizeWithAttributes:@{NSFontAttributeName:[label font]}];
    CGFloat strikeWidth = textSize.width;

    UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(self.view.bounds.size.height / 2, 200, strikeWidth, 2)];
    lineView.backgroundColor = [UIColor redColor];

    lineView.tag = 100;

    [cell.contentView addSubview:lineView];
}

3 个答案:

答案 0 :(得分:2)

不是使用UIView并向细胞添加子视图,而是应该使用NSAttributedString作为单元格文本,NSStrikethroughStyleAttributeName使用NSStrikethroughColorAttributeName进行删除颜色检查

答案 1 :(得分:0)

你的问题在这里:

UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(self.view.bounds.size.height / 2, 200, strikeWidth, 2)];

在这种情况下," self"是tableViewController,而不是标签或单元格。您正在做的是将视图的x原点设置为屏幕的高度的一半,y原点下降200点,宽度为 strikeWidth 并且高度为2。

因为您要添加的线视图将成为单元格的子视图,所以您总是希望相对于它的超级视图构建框架,在这种情况下,该视图是单元格本身。你可能想要使用类似下面的东西:

CGRectMake(CGRectGetMinX(cell.textLabel.frame), CGRectGetHeight(cell.contentView.frame) / 2, strikeWidth, 2)

您可能希望调整值以使其排成一行,但您明白了......

编辑:更好的框架添加,以及更多的代码可以很好地完成:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    UILabel *label = cell.textLabel;

    CGSize textSize = [[label text] sizeWithAttributes:@{NSFontAttributeName:[label font]}];
    CGFloat strikeWidth = textSize.width;

    UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(CGRectGetMinX(label.frame), CGRectGetHeight(cell.contentView.frame) / 2, strikeWidth, 2)];
    lineView.backgroundColor = [UIColor redColor];
    [cell.contentView addSubview:lineView];

    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}

答案 2 :(得分:0)

我认为你的线条出现在你的单元格之外,因为你在你的框架中设置了y的原点200,这看起来很高。

此外,如果你想在UITableviewCell中使用删除线,你最好不要这样做,因为在多次选择时,这个'strikethroughView'将被添加多次,并且永远不会删除。同样在tableview reloadData上,或滚动单元格被重用,你不希望看到随机显示这些strikethroughView。

以下两种方法可以正确完成:

  • 使用NSAttributedString框架。基本上如果允许你对字符串做各种各样的事情,比如设置颜色,背景颜色,段落样式,还有strikeThrough。 这是我在didSelect委托方法中写的内容:

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSString *string = cell.textLabel.text;
    
    NSDictionary *attributes = @{NSStrikethroughStyleAttributeName: @(NSUnderlineStyleThick)};
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:string attributes:attributes];
    cell.textLabel.attributedText = attributedString; 
    }
    
  • 另一个解决方案是在UICollectionViewCell上添加一个Category,并在其中实现“setStrikeTrough”方法。

希望它会有所帮助。