Ios 如何调整横向自定义UITableView分隔符的大小并防止其消失
我决定以编程方式创建自己的Ios 如何调整横向自定义UITableView分隔符的大小并防止其消失,ios,objective-c,uitableview,autolayout,Ios,Objective C,Uitableview,Autolayout,我决定以编程方式创建自己的UITableView分隔符行,因为我需要在每个UITableView单元格的上方和/或下方显示分隔符。我的tableView有静态单元格,因此我不在cellforrowatinexpath中创建分隔符。相反,我为每个单元格设置了属性s,并在viewDidLoad中根据需要添加顶部和/或底部分隔符。它一直在工作,直到我旋转到横向,然后分隔线不会拉伸以填充屏幕-当然,它仍然与创建时的宽度相同。我不知道如何自动调整它们以适应屏幕的宽度 我尝试添加自动布局约束(前导、尾随、顶
UITableView
分隔符行,因为我需要在每个UITableView单元格的上方和/或下方显示分隔符。我的tableView
有静态单元格,因此我不在cellforrowatinexpath
中创建分隔符。相反,我为每个单元格设置了属性
s,并在viewDidLoad
中根据需要添加顶部和/或底部分隔符。它一直在工作,直到我旋转到横向,然后分隔线不会拉伸以填充屏幕-当然,它仍然与创建时的宽度相同。我不知道如何自动调整它们以适应屏幕的宽度
我尝试添加自动布局约束(前导、尾随、顶部/底部),但由于某些原因,它不起作用-宽度没有改变,但没有记录错误消息,表明约束有任何问题。分隔线有时也会在滚动或旋转时消失,如果我注释掉自动布局约束,则它们不会消失
因此,如何使自定义单元格分隔符在旋转时始终拉伸以填充设备宽度,以及如何防止它们消失
如果以不同的方式创建自定义单元格分隔符更容易/更好,我愿意这样做。当细胞处于静止状态时,除了我的方法之外,我不知道如何做到这一点。我考虑过在故事板中创建视图,并以可视化方式设置约束,但这不等同于我以编程方式所做的工作吗?如果它们是动态单元格,我会在cellforrowatinexpath
中执行
//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,我们已经能够解决线条没有延伸到填充宽度的问题,现在它们在突出显示单元格时被保留。但还有一个问题我还没有解决,因为我不知道为什么会发生。向下滚动或向上滚动后,分隔线消失。但这与自动布局约束有关,因为以前的解决方案存在其他问题,但没有出现此问题。以下是导致线条消失的当前解决方案。如果有人知道如何防止这个问题(并保留已经解决的其他问题),我将不胜感激
您不应将initWithFrame和Auto Layout混合使用。使用Visual Format Language for 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的初步帮助下,我已经找出了解决所有问题的约束条件,并且运行良好:
[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]];
谢谢,这真的很有效!只有一个问题。当单元格具有accessoryType(例如,公开指示符)时,分隔线停止在该视图,而不是屏幕的右边缘。我怎样才能使它始终处于边缘?干杯,你说得对。我没有想过。。。不过,我可以用一个技巧来对付它(见我的帖子编辑)。谢谢,我会在假期后回去工作时试试看。:)我注意到了另一个问题,尽管这个问题很小。当您点击单元格时,它会高亮显示,iOS会使自定义视图消失。我用CALayer
在我的第一个解决方案中解决了这个问题,但是我不能再使用它了,因为边界没有定义。您能想出一种解决方案,在使用这种新方法高亮显示单元格时保留线条吗?这是一种已知的情况:当选中UITableViewcell时,其contentView中所有UIView的背景色都会消失。存在几种解决方案(请参阅或)。我已经研究了这些问题,这就是我如何偶然发现CALayer解决方案的原因。但我并没有把那个细胞分类。也许还有另一种解决方案不需要子类化。
[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]];