Почему Interface Builder меняет мои раскадровки? - PullRequest
0 голосов
/ 11 февраля 2019

В XCode 10.1 Interface Builder продолжает портить мои раскадровки.Сначала, казалось бы, наугад, изменение размера и / или положения тщательно расположенных элементов пользовательского интерфейса.Я могу это исправить.Затем, когда я внесу несвязанное изменение в другой элемент раскадровки, он снова вернется обратно.К моменту, когда я исправляю 1 ширину 1 элемента пользовательского интерфейса, когда я смотрю на изменения в коде xml, я замечаю, что свойства ширины и / или положения десятков других элементов пользовательского интерфейса снова запутались.Даже если я решу зафиксировать все эти изменения, предоставив Интерфейсному Разработчику свой путь, в следующий раз, когда я отредактирую что-то, произойдет новая, казалось бы, случайная перемена.

Анализируя поведение ядра, я заметил следующие вещи:

  • Похоже, что все имеет отношение к представлениям, имеющим widthSizable = "YES" и heightSizable = "YES", размещенным внутри видов, которые также имеют эти свойства.
  • Что вы видитеэто не всегда то, что вы получаете.Если в XML указано, что ширина объекта равна 103, то Интерфейсный Разработчик может сказать, что это 104. Но я не буду фиксировать это изменение в XML, пока вы не внесете какие-то реальные изменения в дизайн.Только в этот момент код изменится с 103 на 104.В результате изменение свойства одного элемента может привести к изменению множества других элементов.

См. Пример кода.У меня есть 3 розовых представления, являющихся подпредставлением 3 красных родительских представлений.Розовые виды тщательно расположены с шагом x = 4, y = 4 и шириной и высотой 263. У меня также есть 2 метки, размещенные внутри подпредставления.помещается в x = 25 с шириной 103.

Но открытие этого в Интерфейсном Разработчике изменит вещи.У первого и третьего розового вида ширина будет уменьшена на 1 точку.Второй розовый вид и вторая метка будут иметь ширину, увеличенную на 1 пункт, а позиция x уменьшена на 1 пункт.XML-код раскадровки будет изменен только после того, как вы внесете какое-то реальное ручное изменение, например исправление одного из изменений.

Что происходит?Похоже, что все связано со свойствами автоматического изменения размеров представлений.

Почему разработчик интерфейса настаивает на этих изменениях?Есть ли какие-то настройки, которые мне нужно использовать, чтобы не дать конструктору изменений вносить изменения от моего имени?

<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
    <device id="ipad9_7" orientation="landscape">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--Pads View Controller-->
        <scene sceneID="29X-ru-k3e">
            <objects>
                <viewController storyboardIdentifier="DUBPadsViewController" id="K8u-H8-1gq" customClass="DUBPadsViewController" customModule="InterfaceBuilderBug" customModuleProvider="target" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="R7c-RJ-s0L"/>
                        <viewControllerLayoutGuide type="bottom" id="cf2-ad-Oen"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="W4r-9T-iqb">
                        <rect key="frame" x="0.0" y="0.0" width="973" height="335"/>
                        <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                        <subviews>
                            <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZrE-4D-D5t">
                                <rect key="frame" x="40" y="299" width="134" height="22"/>
                                <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
                                <subviews>
                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Label A" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Rcr-5Y-UIA">
                                        <rect key="frame" x="25" y="0.0" width="103" height="22"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
                                        <fontDescription key="fontDescription" name="Avenir-Medium" family="Avenir" pointSize="11"/>
                                        <nil key="highlightedColor"/>
                                    </label>
                                </subviews>
                                <color key="backgroundColor" red="1" green="0.28351856600000003" blue="0.11137302910000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            </view>
                            <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wA1-jm-LnT">
                                <rect key="frame" x="177" y="299" width="134" height="22"/>
                                <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
                                <subviews>
                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Label B" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZmY-M4-qUf">
                                        <rect key="frame" x="25" y="0.0" width="103" height="22"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
                                        <fontDescription key="fontDescription" name="Avenir-Medium" family="Avenir" pointSize="11"/>
                                        <nil key="highlightedColor"/>
                                    </label>
                                </subviews>
                                <color key="backgroundColor" red="1" green="0.28351856600000003" blue="0.11137302910000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            </view>
                            <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="EKv-pO-CaP">
                                <rect key="frame" x="40" y="16" width="271" height="271"/>
                                <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
                                <subviews>
                                    <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="KkF-uY-icM">
                                        <rect key="frame" x="4" y="4" width="263" height="263"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
                                        <color key="backgroundColor" red="0.93333333330000001" green="0.48687065969999999" blue="0.92156862750000001" alpha="1" colorSpace="deviceRGB"/>
                                    </view>
                                </subviews>
                                <color key="backgroundColor" red="1" green="0.28351856600000003" blue="0.11137302910000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            </view>
                            <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="a9U-gL-6LU">
                                <rect key="frame" x="351" y="16" width="271" height="271"/>
                                <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
                                <subviews>
                                    <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="V3f-qo-7Gz">
                                        <rect key="frame" x="4" y="4" width="263" height="263"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
                                        <color key="backgroundColor" red="0.93333333330000001" green="0.48687065969999999" blue="0.92156862750000001" alpha="1" colorSpace="deviceRGB"/>
                                    </view>
                                </subviews>
                                <color key="backgroundColor" red="1" green="0.28351856600000003" blue="0.11137302910000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            </view>
                            <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Abi-Xp-jLY">
                                <rect key="frame" x="660" y="16" width="271" height="271"/>
                                <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
                                <subviews>
                                    <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8jR-Gr-IWp">
                                        <rect key="frame" x="4" y="4" width="263" height="263"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
                                        <color key="backgroundColor" red="0.93333333330000001" green="0.48687065969999999" blue="0.92156862750000001" alpha="1" colorSpace="deviceRGB"/>
                                    </view>
                                </subviews>
                                <color key="backgroundColor" red="1" green="0.28351856600000003" blue="0.11137302910000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            </view>
                        </subviews>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                    </view>
                    <size key="freeformSize" width="973" height="335"/>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="6NU-Rl-zi7" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="669" y="-44"/>
        </scene>
    </scenes>
</document>

1 Ответ

0 голосов
/ 14 февраля 2019

Попробуйте использовать autolayout .С его помощью вы можете ограничить свои представления любыми размерами и позициями, и они сохранятся, даже если вы измените размер холста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...