2

当我有IB六个用户约束,建立看起来像这样同时满足约束条件:无法动画

H:|-(593)-[UIView(411)]-(20)-| 
V:|-(20)-[UIView(288)]-(396)-| 

我增长和收缩通过改变约束条件,然后调用layoutIfNeeded的看法。例如,成长的看法,我会做的事:

H:|-(20)-[UIView(984)]-(20)-| 
V:|-(20)-[UIView(663)]-(20)-| 

然后调用

[UIView animateWithDuration:.5 animations:^{ 
    [self.view layoutIfNeeded]; 
}]; 

这种技术的发展和缩小我的观点,这看起来不错,但我给予了相当混乱的警告:

Unable to simultaneously satisfy constraints. 
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x148d5af0 H:[UIView:0x148d4e50(411)]>", 
    "<NSLayoutConstraint:0x148cc940 H:[UITableView:0xace7600(319)]>", 
    "<NSLayoutConstraint:0x148ce040 H:|-(NSSpace(20))-[UITableView:0xacd4e00] (Names: '|':UIView:0x148cddd0)>", 
    "<NSLayoutConstraint:0x148cdf00 H:[UITableView:0xace7600]-(NSSpace(20))-| (Names: '|':UIView:0x148cddd0)>", 
    "<NSLayoutConstraint:0x148cdea0 H:[UITableView:0xacd4e00]-(NSSpace(8))-[UITableView:0xace7600]>", 
    "<NSLayoutConstraint:0x148d4c10 UIView:0x148cddd0.trailing == UIView:0x148cdd40.trailing>", 
    "<NSLayoutConstraint:0x148d4b90 H:|-(0)-[UIView:0x148cddd0] (Names: '|':UIView:0x148cdd40)>", 
    "<NSLayoutConstraint:0x148d6020 H:|-(320)-[UIView:0x148cdd40] (Names: '|':UIView:0x148cd330)>", 
    "<NSLayoutConstraint:0x148d5fa0 UIView:0x148cdd40.trailing == UIView:0x148cd330.trailing>", 
    "<NSLayoutConstraint:0x148d5f60 H:[UIView:0x148d4e50]-(NSSpace(20))-| (Names: '|':UIView:0x148cd330)>", 
    "<NSLayoutConstraint:0x148d5ee0 H:|-(20)-[UIView:0x148d4e50] (Names: '|':UIView:0x148cd330)>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x148cc940 H:[UITableView:0xace7600(319)]> 

现在所有这些约束都由IB生成。我有双^(三重!)检查了这一点。我已经把这些约束与笔和纸一起,并得到这个:

UIView_A H:[-(20)-[UIView_E]-(20)-] and H:[-(320)-(UIView_B) 
UIView_B H:[-(0)-[UIView_D] 
UIView_C H:[UIView_C(411)] 
UIView_D H:[-(20)-[UITableView_F]-[UITableView_G(319)]-(20)-] 

我不明白如何不能满足这些约束。他们看起来很好。我不会更改它们,它们是由IB生成的。 IB产生的约束是否自动满足?

或者,至少是否有办法阻止警告?它的表现完美,我不需要看到它打破了一个似乎没有做任何事情的约束。

+0

没有NSAutoResizingMaskLayoutConstraints,这不是重复的。 – 2013-08-05 20:26:22

回答

3

所以,事实证明,我改变约束的顺序很重要。

为了生长的观点,我将

  1. 增加宽度:H:| - (593) - [UIView的()] - (20) - |
  2. 减少领先空间:H:| - () - [UIView(984)] - (20) - |

这不会产生警告。但是,如果我这样做以相反的顺序,我会得到一个警告:

Unable to simultaneously satisfy constraints. 
Probably at least one of the constraints ... 

...Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x1567f650 H:[UITableView:0x119e6200(319)]> 

当萎缩的观点,我复制了增加宽度(以相同的顺序),只是改变了值的代码。这给了我在我原来的问题中发布的警告。当我将订单缩小时,警告消失。


这是为什么?我不知道。我会更新,因为我发现更多。

+0

奇怪。你是对的。刚刚翻转的顺序,我更新了一些约束,并删除了错误。 – 2013-03-10 21:42:51

4

这个约束:

H:[UITableView的:0xace7600(319)]>”

似乎是对系统分辨率的障碍

你可以删除它。?

+0

该约束由IB生成。当我删除它时,警告消失,但在动画之后我的视图混乱了。嗯 - 也许我应该循环所有的观点。 – 2013-03-07 16:32:02

+0

AHA!我找到了!我改变限制的顺序很重要! – 2013-03-07 16:41:03

+0

Upvote寻求帮助。 – 2013-03-07 16:41:11

0

我得到了同样的信息,我终于明白了为什么会发生这种情况,
我的解决方案是:在动画的任何时刻,不要让任何对象翻转。

换句话说,应该是任何对象的外侧, 但有时候约束在动画中,而不是我们的期望。

换句话说,不要让顶部边缘由于约束动画而侵入底部边缘。

例如,

 top constraint: topA = initially 100 

        [Box A] 

    bottom constraint: botA = initially 150 

现在,如果你设置像下面和动画,

 topA = 300 
     botA = 25 

那么应该出现的错误, 原因:螺纹侵入底部量之前下边距下去。 所以, 你宁愿更改顺序,

 botA = 25 
     topA = 300 

然后错误将消失,因为底部的约束将保持质量和下一顶约束的高度将缩小对象的高度不侵下边距。

* Point: 让对象的宽度和高度大于0 CONTINUALLY即使在动画期间, 也不会被约束条件改变中断。

我希望我帮你。