AutoLayout,无法同时满足约束

编程入门 行业动态 更新时间:2024-10-21 18:44:59
本文介绍了AutoLayout,无法同时满足约束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

刚刚开始学习iOS AutoLayout,接口构建器非常直接,但是当我尝试在代码上存档相同的东西时

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@H:| - (== 2) - [_ nextKeyboardButton] - (== 2) - [_ numPadButton] - (== 2) - [_ spaceButton] - (== 2) - [_ returnButton] - (== 2) - | options:0 metrics:0 views:NSDictionaryOfVariableBindings(_nextKeyboardButton,_numPadButton,_spaceButton,_returnButton)]];

它会引发异常,

无法同时满足约束条件。

以下列表中的至少一个约束可能是你的一个不想要。试试这个:(1)看看每个约束并试着找出你不期望的东西; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果你看到你不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性translatesAutoresizingMaskIntoConstraints的文档)(< NSLayoutConstraint:0x6000000966c0 H:| - (2) - [ UIButton:0x7fe4f1d1c760'Next'](名称:'|':UIInputView:0x7fe4f1f04d00)>,< NSLayoutConstraint:0x600000096710 H:[UIButton:0x7fe4f1d1c760'Next'] - (2) - [UIButton: 0x7fe4f1d1d1d0'123']>,< NSLayoutConstraint:0x600000096760 H:[UIButton:0x7fe4f1d1d1d0'123'] - (2) - [UIButton:0x7fe4f1d1d6f0'Space']>, < NSLayoutConstraint:0x6000000967b0 H:[UIButton:0x7fe4f1d1d6f0'Space'] - (2) - [UIButton:0x7fe4f1d1d8d0'Return']>,< NSLayoutConstraint:0x600000096800 H:[UIButton:0x7fe4f1d1d8d0'返回'] - (2) - |(名称:'|':UIInputView:0x7fe4f1f04d00)>,< NSLayoutConstraint:0x600000096e40'UIView-Encapsulated-Layout-Width'H:[UIInputView:0x7fe4f1f04d00( 0)]>) 将尝试通过违约约束来恢复< NSLayoutConstraint:0x6000000967b0 H:[UIButton:0x7fe4f1d1d6f0'Space'] - (2) - [UIButton:0x7fe4f1d1d8d0'Return']>

所有4个按钮.translatesAutoresizingMaskIntoConstraints = NO;

<我想知道出了什么问题?非常感谢帮助:)

仅供参考:我在iOS8 SDK上工作

解决方案

如何找到不可满足约束的最简单方法:

  • 为视图中的每个约束设置唯一标识符:

  • 为 NSLayoutConstraint 创建简单扩展名:

SWIFT :

extension NSLayoutConstraint { 覆盖public var description:String { let id =标识符? 返回id:\(id),常数:\(常数)//你可以在这里打印任何你想要的东西} }

目标-C

@interface NSLayoutConstraint(Description) @end @implementation NSLayoutConstraint(Description) - (NSString *)description { return [NSString stringWithFormat:@id:%@,constant:%f,self.identifier,self.constant]; } @end

  • 再次构建它,现在你有更多可读输出:

  • 一旦你拿到 id ,你可以在你的中轻点点击它查找导航器:

  • 并快速找到它:

如何简单修复案例?

  • 尝试将优先级更改为 999 用于破坏约束。

请参阅此处的相关答案:无法同时满足约束条件,将尝试通过违反约束来恢复

Just started learning iOS AutoLayout, Interface builder very straight forward, but when I try to archive the same thing on the code

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(==2)-[_nextKeyboardButton]-(==2)-[_numPadButton]-(==2)-[_spaceButton]-(==2)-[_returnButton]-(==2)-|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(_nextKeyboardButton,_numPadButton,_spaceButton,_returnButton)]];

it raises an exception,

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:0x6000000966c0 H:|-(2)-[UIButton:0x7fe4f1d1c760'Next'] (Names: '|':UIInputView:0x7fe4f1f04d00 )>", "<NSLayoutConstraint:0x600000096710 H:[UIButton:0x7fe4f1d1c760'Next']-(2)-[UIButton:0x7fe4f1d1d1d0'123']>", "<NSLayoutConstraint:0x600000096760 H:[UIButton:0x7fe4f1d1d1d0'123']-(2)-[UIButton:0x7fe4f1d1d6f0'Space']>", "<NSLayoutConstraint:0x6000000967b0 H:[UIButton:0x7fe4f1d1d6f0'Space']-(2)-[UIButton:0x7fe4f1d1d8d0'Return']>", "<NSLayoutConstraint:0x600000096800 H:[UIButton:0x7fe4f1d1d8d0'Return']-(2)-| (Names: '|':UIInputView:0x7fe4f1f04d00 )>", "<NSLayoutConstraint:0x600000096e40 'UIView-Encapsulated-Layout-Width' H:[UIInputView:0x7fe4f1f04d00(0)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x6000000967b0 H:[UIButton:0x7fe4f1d1d6f0'Space']-(2)-[UIButton:0x7fe4f1d1d8d0'Return']>

All 4 buttons .translatesAutoresizingMaskIntoConstraints = NO;

I wonder what is wrong ? help is really appreciated :)

FYI: I work on iOS8 SDK

解决方案

The easiest way how to find unsatisfiable constraints:

  • set unique identifier for every constraint in your view:

  • create simple extension for NSLayoutConstraint:

SWIFT:

extension NSLayoutConstraint { override public var description: String { let id = identifier ?? "" return "id: \(id), constant: \(constant)" //you may print whatever you want here } }

OBJECTIVE-C

@interface NSLayoutConstraint (Description) @end @implementation NSLayoutConstraint (Description) -(NSString *)description { return [NSString stringWithFormat:@"id: %@, constant: %f", self.identifier, self.constant]; } @end

  • build it once again, and now you have more readable output for you:

  • once you got your id you can simple tap it in your Find Navigator:

  • and quickly find it:

HOW TO SIMPLE FIX THAT CASE?

  • try to change priority to 999 for broken constraint.

See the related answer here: Unable to simultaneously satisfy constraints, will attempt to recover by breaking constraint

更多推荐

AutoLayout,无法同时满足约束

本文发布于:2023-11-27 09:21:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1637485.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:AutoLayout

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!