ios中的约束不变

Posted

技术标签:

【中文标题】ios中的约束不变【英文标题】:Constraints not changing in ios 【发布时间】:2014-12-29 05:21:25 【问题描述】:

我创建了一个应用程序,其中有一个tableview。我想在某些情况下移动view,所以我更改了约束,它工作正常,但是当我再次尝试更改约束时,view 没有移动。

我的代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

UINib *nib = [UINib nibWithNibName:@"GoalDetailsCustomCardCell" bundle:nil];

[goalDetailsTableView registerNib:nib forCellReuseIdentifier:@"CardCell"];
GoalDetailsTableViewCell *cell = [goalDetailsTableView dequeueReusableCellWithIdentifier:@"CardCell"];

if(cell == nil)

    cell = [goalDetailsTableView dequeueReusableCellWithIdentifier:@"CardCell"];


if([self.swipedRowArray containsObject:indexPath])
        
            NSLog(@"%f", cell.cardDetails.frame.origin.x);
            NSLog(@"%f", cell.cardDetails.frame.size.width);
            NSLog(@"%f", cell.cardDetails.frame.size.height);

            cell.cardDetails.translatesAutoresizingMaskIntoConstraints = NO;
            NSDictionary *contentDictionary = @@"cardDetails":cell.cardDetails, @"actionReminderCard":cell.actionCardReminder;
            [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(-314)-[cardDetails]" options:0 metrics:nil views:contentDictionary]];
            [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[actionReminderCard]" options:0 metrics:nil views:contentDictionary]];
            NSLog(@"%f", cell.cardDetails.frame.size.width);
            NSLog(@"%f", cell.cardDetails.frame.size.height);
        

else


            NSLog(@"%f", cell.cardDetails.frame.origin.x);
            NSLog(@"%f", cell.cardDetails.frame.size.width);
            NSLog(@"%f", cell.cardDetails.frame.size.height);

            cell.cardDetails.translatesAutoresizingMaskIntoConstraints = NO;
            NSDictionary *contentDictionary = @@"cardDetails":cell.cardDetails, @"actionReminderCard":cell.actionCardReminder;
            [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[cardDetails]" options:0 metrics:nil views:contentDictionary]];
            [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-330-[actionReminderCard]" options:0 metrics:nil views:contentDictionary]];
            NSLog(@"%f", cell.cardDetails.frame.size.width);
            NSLog(@"%f", cell.cardDetails.frame.size.height);
        

在上面的代码中,如果部分工作正常,当涉及到 else 时,我尝试将约束更改为 xib 中设置的默认约束,但它不起作用。它显示的视图与我之前更改约束时相同。

提前致谢。

【问题讨论】:

你必须再次更新新的约束 @SR Nayak - 你能帮我解决旧的限制吗 【参考方案1】:

每当您添加约束时。添加新约束时它不会删除。所以你应该删除这些约束并添加新的约束,或者你应该更新相同的约束。您可以通过两种方式做到这一点。

以编程方式首先删除所有约束,然后添加新约束。与@Tejvansh Singh Chhabra 的回答相同。 但要确保它会删除你的所有内容视图的约束。

[cell.contentView removeConstraints:cell.contentView.constraints];

Other 选项是取NSLayoutConstraintX 位置的出口,然后更新它。但我认为为此您应该将所有 contentview 的子视图添加到 UIView,然后将领先约束绑定到您的插座,并在 if-else 条件下更改 cell.yourConstraint.constant = yourvalue

在您的自定义单元中使用一个插座

IBOutlet NSLayoutConstraint *constraint_xPosition;

然后如下图所示将其输出。

并且在 if-else 条件下更改常量,例如 cell.constraint_xPosition.constant = 0;//-320

也许这会对你有所帮助。

【讨论】:

你能告诉我你指定的第二种方式吗,比如NSLayoutConstraint的出口。你能给我一些代码示例吗 我可以知道它应该添加到 .h 或 .m 文件中吗? customcell.h 中的@Balaji 并将其绑定到 xib 中。 但是如果在 customcell.h 中添加这个插座。如果其他条件,我无法在cellFOrRowAtIndexPath 中获得此插座。 @Balaji 你添加了cell.constraint_xPosition.constant = yourvalue 吗?与您访问 cell.cardDetails 的方式相同【参考方案2】:

在向单元格添加新约束之前,您需要先删除旧约束,这可能是导致问题的原因。删除所有约束后,您需要以编程方式再次添加所有约束。

[cell.contentView removeConstraints:cell.contentView.constraints];

【讨论】:

以上是关于ios中的约束不变的主要内容,如果未能解决你的问题,请参考以下文章

iOS 制作两个视图覆盖全视图

了解 iOS Objective C 中的视觉格式约束

Xamarin iOS:无法对Visual Studio 2017中的控件设置约束

使用 IOS 中的约束将 UIView 中的子视图居中

iOS 8 中的 UITableViewCell 约束在 iOS7 中不起作用

iOS 自动布局 - xib 中的等高约束