Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何调整横向自定义UITableView分隔符的大小并防止其消失_Ios_Objective C_Uitableview_Autolayout - Fatal编程技术网

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]];