- (voID)vIEwWillAppear:(BOol)animated{ [super vIEwWillAppear:animated]; NSLog(@"%@",self.tableVIEwHeight); self.tableVIEwHeight.constant = 0; NSLog(@"%@",self.tableVIEwHeight); [self.tableVIEw setNeedsUpdateConstraints]; [self.tableVIEw setNeedsLayout]; [self.vIEw setNeedsUpdateConstraints]; [self.vIEw setNeedsLayout];}
但有时这项工作有时并非如此.我总是在日志中看到正确的消息:
<NSLayoutConstraint:0x9ebe7a0 V:[UItableVIEw:0xa345a00(304@500)] priority:500><NSLayoutConstraint:0x9ebe7a0 V:[UItableVIEw:0xa345a00(0@500)] priority:500>
为什么会这样?如何在UI变为可见之前更改NSLayoutConstraints属性?
更新:
这段代码20次20次(但我现在总是这样认为):
- (voID)vIEwWillAppear:(BOol)animated{ [super vIEwWillAppear:animated]; dispatch_async(dispatch_get_main_queue(),^{ self.tableVIEwHeight.constant = 0; [self.vIEw setNeedsUpdateConstraints]; });}
告诉我为什么会发生这种情况?
更新2:
看起来像以前的代码仍然无法工作,但这有效:
- (voID)vIEwWillAppear:(BOol)animated{ [super vIEwWillAppear:animated]; self.topVIEwHeight.constant += self.tableVIEwHeight.constant; self.tableVIEwHeight.constant = 0; [self.vIEw setNeedsUpdateConstraints];}
更新3:
我永远不会将相同的优先顺序(如500)设置为具有连接视图的几个约束……
解决方法 我注意到你的优先级为500,这意味着你愿意打破这个约束以满足其他约束.我想知道你有什么其他限制.如果在Interface Builder中执行此 *** 作,它会产生一种恼人的倾向(至少在Xcode 4.6.x中),以添加它认为需要的任何约束以消除歧义.您可能希望检查是否没有其他高度限制,或者优先使用的顶部和底部约束.最重要的是,你设置常量的技术很好(想想,我发现只使用setNeedsLayout就足够了),问题可能还有其他可能挥之不去的约束.
如果将此约束的优先级更改为1000,如果存在冲突约束,则会出现错误,这有助于诊断问题.但事实上,你告诉自动布局,如果忽略这个高度约束而支持其他冲突约束(优先级更高或相同),则可以.通过将优先级设置为1000,您说您永远不希望忽略此约束.
总结以上是内存溢出为你收集整理的ios – 在viewDidLoad或viewWillAppear中更改NSLayoutContraint常量不起作用全部内容,希望文章能够帮你解决ios – 在viewDidLoad或viewWillAppear中更改NSLayoutContraint常量不起作用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)