如何在风景上调整自定义UITableView分隔符的大小,并防止消失

我已经决定以编程方式创build我自己的UITableView分隔线,因为我需要很好地控制在每个单独的UITableViewCell上方和/或下方显示分隔符。 我的tableView有静态单元格,所以我不在cellForRowAtIndexPath创build分隔符。 相反,我有property为每个单元格,并在viewDidLoad ,我需要添加一个顶部和/或底部的分隔符。 这是工作,直到我旋转到风景,然后分隔线不伸展,以填补屏幕 – 它当然仍然是在创build时相同的宽度。 我没有看到我可以自动调整它们以适应屏幕的宽度。

我尝试添加自动布局约束(前导,尾随,顶部/底部),但由于某种原因,它不工作 – 宽度不会改变,但没有错误消息logging,以指示约束的任何错误。 分隔线有时也会在滚动或旋转时消失,如果我注释掉自动布局约束,那么它们不会消失。

那么如何使我的自定义单元格分隔符始终伸展以在旋转时填充设备宽度,以及如何防止它们消失?

如果以不同的方式创build自定义单元分隔符会更容易/更好,我愿意这样做。 我只是不知道如何做到这一点,除了我的方法,当细胞是静态的。 我考虑在Storyboard中创build视图,并以可视化的方式设置约束,但这不等同于我以编程方式进行的操作吗? 如果他们是dynamic单元格,我会在cellForRowAtIndexPath

 //In viewDidLoad: [self addTopSeparatorForCell:self.myCell]; //Helper method - (void)addTopSeparatorForCell:(UITableViewCell *)cell { UIView *topSeparator = [[UIView alloc] initWithFrame:CGRectMake(15, 1, cell.contentView.frame.size.width, 0.5)]; //add CALayer to preserve line separator visibility when row is highlighted CALayer *backgroundColorLayer = [CALayer layer]; backgroundColorLayer.frame = topSeparator.bounds; backgroundColorLayer.backgroundColor = [UIColor colorWithWhite:204/255.0f alpha:1].CGColor; [topSeparator.layer addSublayer:backgroundColorLayer]; [cell.contentView addSubview:topSeparator]; //add auto layout constraints topSeparator.translatesAutoresizingMaskIntoConstraints = NO; NSLayoutConstraint *cn = nil; cn = [NSLayoutConstraint constraintWithItem:topSeparator attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:15]; [cell.contentView addConstraint:cn]; cn = [NSLayoutConstraint constraintWithItem:topSeparator attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:0]; [cell.contentView addConstraint:cn]; cn = [NSLayoutConstraint constraintWithItem:topSeparator attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeTop multiplier:1.0 constant:1]; [cell.contentView addConstraint:cn]; } 

在这里输入图像说明

编辑 :感谢@ user1966109,我们已经能够解决这个问题,没有扩大的行来填充宽度,现在他们保留时,突出显示一个单元格。 但仍然有一个问题仍然存在,我不能解决,因为我不知道为什么发生。 滚动向下滚动后,分隔线消失。 这与自动布局约束有关,因为之前有其他问题的解决scheme没有出现这个问题。 这是目前的解决scheme,导致线消失。 我会很感激,如果有人知道如何防止这个问题(并保留其他问题已经解决)。

 [self.cell addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(15@750)-[myView]-(-47@750)-|" options:0 metrics:0 views:viewsDictionary]]; [self.cell addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[myView(2)]-(-2@750)-|" options:0 metrics:0 views:viewsDictionary]]; 

哼哼…你在混合initWithFrame和Auto layout。 不好。 使用可视化格式语言进行自动布局,您可以使用几行代码获得较好的结果:

 //@interface TableViewController () @property (weak, nonatomic) IBOutlet UITableViewCell *cell; //@implementation TableViewController - (void)viewDidLoad { [super viewDidLoad]; UIView *myView = [[UIView alloc] init]; myView.backgroundColor = [UIColor redColor]; [self.cell.contentView addSubview:myView]; myView.translatesAutoresizingMaskIntoConstraints = NO; NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(myView); [self.cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[myView]|" options:0 metrics:0 views:viewsDictionary]]; [self.cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[myView(2)]" options:0 metrics:0 views:viewsDictionary]]; } 

这完美地处理旋转。

编辑!

如果使用附件视图,请设置以下约束:

 //Set a negative value to the trailing space in order to display myView under the accessory view //Those constraints work for both self.cell and self.cell.contentView (kind of odd) [self.cell addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(15@750)-[myView]-(-47@750)-|" options:0 metrics:0 views:viewsDictionary]]; [self.cell addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[myView(2)]-(-2@750)-|" options:0 metrics:0 views:viewsDictionary]]; 

在user1966109最初的帮助下,我已经find了解决所有问题的约束条件,并且运行良好:

  [cell addConstraint:[NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:cell attribute:NSLayoutAttributeLeading multiplier:1.0 constant:indent]]; [cell addConstraint:[NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:cell attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:0.0]]; [cell addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[imageView(0.5)]" options:0 metrics:0 views:viewsDictionary]];