iOS 自动布局:表格视图单元格宽度 = 0

Posted

技术标签:

【中文标题】iOS 自动布局:表格视图单元格宽度 = 0【英文标题】:iOS Auto layout: Table View Cell width = 0 【发布时间】:2014-10-23 17:03:01 【问题描述】:

我使用的是 Xcode 6.0.1,并且我第一次在带有 Static CellsTable View 上使用自动布局。

我在第一个表格单元格中有一个文本字段。这有一个固定的高度,但我希望 Text Field 的宽度与表格(或表格单元格,因为它们的宽度相同)的宽度一起缩放。这是因为我想利用 iPhone 6 和 6 Plus 的额外宽度。

我在文本字段中添加了高度限制(40 像素)以及前导和尾随空间限制(14 像素)。我还将 Y 对齐与超级视图居中。这些都不是相对于边距,因为我想以 ios 7 为目标,我相信这个选项会导致问题。

我的问题是表格单元格的宽度想要变为零,这导致我的文本字段的宽度也变为零,因为前导和尾随空间限制。如果我为 Text Field 设置了固定宽度,那么一切都很好,但是它没有利用 iPhone 6 上可用的额外宽度。我的表格和表格单元格在我实际上运行了该应用程序,尽管它们在 Xcode 中显示为“错位”,它认为高度和宽度应该为零(参见下面的屏幕截图)。

我已经在 Google 上搜索了很多,但找不到遇到这些问题的其他人。缩放到表格单元格的高度是一个常见问题,但不是宽度。

这是我的视图层次结构,其中 Text Field(称为 Title)上的约束显示......

这就是我认为问题所在,因为 Table View Cell预期 高度和宽度都为零...

我尝试在 Table View Cell 等上设置约束以尝试为其设置非零宽度,但这似乎是不可能的。


这是我的 .storyboard 文件的前 40 行左右。我没有摆弄 XML,它直接来自 Xcode。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6245" systemVersion="14A379a" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="3">
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
        <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
    </dependencies>
    <scenes>
        <!--Dev Note Edit Screen-->
        <scene sceneID="2">
            <objects>
                <tableViewController storyboardIdentifier="DevNoteEditScreen" id="3" customClass="DevNoteEditScreen" sceneMemberID="viewController">
                    <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="11" sectionFooterHeight="11" id="4">
                        <rect key="frame" x="0.0" y="0.0"  />
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                        <sections>
                            <tableViewSection id="13">
                                <cells>
                                    <tableViewCell contentMode="scaleToFill" misplaced="YES" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="11">
                                        <rect key="frame" x="0.0" y="134"  />
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="11" id="12">
                                            <rect key="frame" x="0.0" y="0.0"  />
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="Title" placeholder="Title" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="18">
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="40" id="kkF-JV-vbs"/>
                                                    </constraints>
                                                    <color key="textColor" red="0.16078431372549021" green="0.50196078431372548" blue="0.72549019607843135" alpha="1" colorSpace="calibratedRGB"/>
                                                    <fontDescription key="fontDescription" name="AvenirNext-DemiBold" family="Avenir Next" pointSize="19"/>
                                                    <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
                                                    <connections>
                                                        <action selector="EditBegin:" destination="3" eventType="editingDidBegin" id="106"/>
                                                        <action selector="txtTitle_Changed:" destination="3" eventType="editingChanged" id="255"/>
                                                    </connections>
                                                </textField>
                                            </subviews>
                                            <constraints>
                                                <constraint firstAttribute="trailing" secondItem="18" secondAttribute="trailing" constant="14" id="08w-eu-Siz"/>
                                                <constraint firstItem="18" firstAttribute="leading" secondItem="12" secondAttribute="leading" constant="14" id="ImE-vD-cJD"/>
                                                <constraint firstAttribute="centerY" secondItem="18" secondAttribute="centerY" id="hA5-l7-zX6"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                    </tableViewCell>

【问题讨论】:

嗯....我在尝试您的设置时没有收到此错误;我的视图层次结构和约束看起来与您的相同。你用的是什么版本的 Xcode(我用的是 6.0.1)? 我也在 6.0.1 (6A317) @rdelmar 你能贴出你的 .storyboard XML 文件吗?我会在上面添加我的... 【参考方案1】:

奇怪的是,我设法通过编辑 .storyboard 文件 XML 并从 &lt;tableViewCell&gt; 元素中删除以下内容来解决此问题...

misplaced="YES"
translatesAutoresizingMaskIntoConstraints="NO"

并将其添加到 &lt;tableViewCell&gt; 元素中...

<autoresizingMask key="autoresizingMask"/>

看来我的故事板文件不知何故搞砸了。

【讨论】:

以上是关于iOS 自动布局:表格视图单元格宽度 = 0的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 中的表格视图单元格自动布局

iOS - 表格视图单元格中的自动布局问题

使用自动布局进行编辑时在表格视图中调整子视图的大小

如何使用自动布局来调整表格视图单元格中的视图大小?

如何在自动布局中滑动表格视图单元格?

如何使用自动布局来调整表格视图单元格中的视图?