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 选项是取NSLayoutConstraint
X 位置的出口,然后更新它。但我认为为此您应该将所有 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中的约束不变的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin iOS:无法对Visual Studio 2017中的控件设置约束