我正在尝试添加一个应该删除文本的UIView(不要担心水平错位)。
但是,在选择行时,会在下面添加几行。为什么呢?
这是我的代码:
-(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];
}
答案 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”方法。
希望它会有所帮助。