自动布局约束在运行时消失
Posted
技术标签:
【中文标题】自动布局约束在运行时消失【英文标题】:Autolayout constraint disappearing at runtime 【发布时间】:2020-02-18 13:53:34 【问题描述】:我有一个简单的表格视图单元格,其中包含两个标签,其定位约束在运行时消失(宽度和纵横比仍然存在)。没有警告,情节提要视图中没有错误,没有控制台日志,而且我不使用大小类。
视图放错了位置(它们粘在左上角),当我启动 Debug View Hierarchy 时,紫色背景上有一个感叹号,表示位置不明确。经检查发现,位置约束不再存在。
我已经尝试再次删除和添加它们,我已经将视图层次结构中的几乎每个 IB 检查器都与工作实现进行了比较,但无法找出区别。我用 lldb 检查了视图,_autolayoutTrace 没有显示约束。
我知道我可以删除 Interface Builder 中的控制器并重新构建它,但我希望能深入了解调试此类问题。
这是故事板中描述表格视图控制器和原型单元的部分:
<tableViewController id="RTg-bl-d8Z" customClass="ChekListViewController" customModule="Todo_app" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" id="5dF-Vx-S1N">
<rect key="frame" x="0.0" y="0.0" />
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="detailDisclosureButton" indentationWidth="10" reuseIdentifier="checkListItem" id="a6e-eR-CO4" customClass="CheckListItemCell" customModule="Todo_app" customModuleProvider="target">
<rect key="frame" x="0.0" y="28" />
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="a6e-eR-CO4" id="EUI-T4-UFi" customClass="CheckListItemCell" customModule="Todo_app" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" />
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="✔️" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KM3-zM-YXK">
<rect key="frame" x="28" y="11" />
<constraints>
<constraint firstAttribute="width" constant="25" id="uyC-B0-CMt"/>
<constraint firstAttribute="width" secondItem="KM3-zM-YXK" secondAttribute="height" multiplier="25:35" id="yPH-cC-BhV"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="I1F-jX-unK">
<rect key="frame" x="61.5" y="18.5" />
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="trailingMargin" secondItem="I1F-jX-unK" secondAttribute="trailing" id="2DJ-vu-eZH"/>
<constraint firstItem="I1F-jX-unK" firstAttribute="centerY" secondItem="KM3-zM-YXK" secondAttribute="centerY" id="5sk-xI-Lws"/>
<constraint firstItem="KM3-zM-YXK" firstAttribute="leading" secondItem="EUI-T4-UFi" secondAttribute="leadingMargin" constant="8" id="T2a-1U-YX9"/>
<constraint firstItem="I1F-jX-unK" firstAttribute="leading" secondItem="KM3-zM-YXK" secondAttribute="trailing" constant="8" id="a2G-6H-iVm"/>
<constraint firstItem="KM3-zM-YXK" firstAttribute="bottom" secondItem="EUI-T4-UFi" secondAttribute="bottomMargin" id="c6K-zY-2tu"/>
<constraint firstItem="KM3-zM-YXK" firstAttribute="top" secondItem="EUI-T4-UFi" secondAttribute="topMargin" id="z4V-Rz-c6k"/>
</constraints>
</tableViewCellContentView>
<connections>
<outlet property="checkMark" destination="KM3-zM-YXK" id="qY4-JT-7iv"/>
<outlet property="textItem" destination="I1F-jX-unK" id="eID-MO-fVV"/>
<segue destination="Kuh-LZ-DVA" kind="presentation" identifier="editItem" trigger="accessoryAction" id="DeL-Ql-cQq"/>
</connections>
</tableViewCell>
</prototypes>
<sections/>
<connections>
<outlet property="dataSource" destination="RTg-bl-d8Z" id="34r-cH-2bg"/>
<outlet property="delegate" destination="RTg-bl-d8Z" id="CsE-gc-hUN"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="Name of the list" id="05Z-xs-cMG">
<barButtonItem key="rightBarButtonItem" systemItem="add" id="oSl-fh-Gh3">
<connections>
<segue destination="Kuh-LZ-DVA" kind="presentation" identifier="addItem" id="6cn-yq-cSG"/>
</connections>
</barButtonItem>
</navigationItem>
</tableViewController>
【问题讨论】:
第一件事——你有多个故事板和/或控制器吗?如果是这样,一个非常常见的“哎呀”正在处理错误的对象。要确定您在 Storyboard 中使用的单元格是您的代码正在使用的单元格,请为标签指定不同的背景颜色并运行应用程序。你看到新的背景颜色了吗? 我有一个故事板,我有正确的控制器类和正确的单元格,标签的文本得到正确的内容。我可以用一个正常工作的控制器替换控制器,但我无法找到正常工作的控制器和有故障的控制器之间的区别,我希望有一个解决方案来调查问题的根源。 如果只是故事板中的一个控制器(或只是几个控制器),请在您的问题中发布 xml 源代码,我们可以看看。 【参考方案1】:好吧,这并不明显......直到它是:)
不知何故 - 通过“哎呀”点击或一些 Xcode / IB 怪癖 - 您的单元格的 Content View
将其类设置为 CheckListItemCell
:
选择单元格的Content View
,进入Identity Inspector面板,将Custom Class
改回默认的UIView
:
更好的结果:
【讨论】:
以上是关于自动布局约束在运行时消失的主要内容,如果未能解决你的问题,请参考以下文章
自定义 UITableViewCell 的自动布局约束在运行时失败