Xcode: AccessoryType.checkmark отодвигает другие виды влево - PullRequest
0 голосов
/ 18 апреля 2019

Xcode 10, Swift 5, iOS 12

Мое приложение содержит 3 ViewControllers:

  1. Вход
  2. TableView
  3. Подробная информацияо данных одной строки в TableView

Если вы редактируете и сохраняете данные в ViewController 3 и используете кнопку «назад» (через NavigationController), чтобы вернуться к ViewController 2, флажокдобавлен в соответствующую строку в TableView.

Проблема заключается в том, что этот флажок сдвигает все остальное влево, хотя я оставил для него место:

enter image description here

Настройка:

  • Горизонтальный StackView с 2 подпредставлениями по 1 метке на каждом
  • Для StackView установлено значение "Fill"
  • Второе подпредставление в два раза меньше первого
  • 10 пунктов слева и 40 пунктов справа (также уже проверено с 100 пунктов, но без изменений)

Я ужепопытался добавить AccessoryType.none к каждой строке (как предложено здесь ), когда я их создаю - вот так:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell
    cell.setLabels("Label1","Label2")
    tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.none
    //cell.accessoryType = UITableViewCell.AccessoryType.none //This doesn't work either

    return cell
}

но он не добавляется (то же самое с другими типами).

Как это исправить?Можно ли установить галочку «позади» всего остального, все еще используя AccessoryType?

1 Ответ

0 голосов
/ 18 апреля 2019

Существует несколько подходов к этому, но я думаю, что лучший способ - это добавить представление изображения в свою пользовательскую ячейку и использовать собственное изображение галочки.

enter image description here

Затем, когда вы устанавливаете текст надписей в cellForRowAt, вместо установки cell.accessoryType = .checkmark там, где это необходимо, установите изображение вида изображения на собственное изображение галочки (или установите вид изображения .alphaна 0 (не показан) или 1 (показан)):

enter image description here

Конечно, вы бы использовали свой намного лучше изображение галочки, чем то, которое я взял для этого примера:)

Редактировать:

Если вы хотите использовать оттенок цвета, вы можете установить свойизображение в шаблонное изображение.Примерно так в вашей ячейке init:

    checkImageView.image = checkImageView.image?.withRenderingMode(.alwaysTemplate)
    checkImageView.tintColor = .red

Редактировать 2:

Если вы не хотите использовать пользовательское изображение, вы можете ограничитьЗадний край представления вашего стека к ячейке вместо представления содержимого ячейки :

enter image description here

40-pts выглядит правильно, но вы хотели бы подтвердить это, и вы хотели бы дважды проверить, что интервалы одинаковы на разных устройствах (сетчатка по сравнению с сетчаткой и т. д.).

Кроме того, правильный способ установки аксессуара - установить его в ячейку в cellForRowAt.Предполагая (основываясь на ваших комментариях), что вы сохраняете ссылку на выбранную строку - скажем, это

var currentSelectedIndexPath: IndexPath!

Вы хотите сделать что-то похожее на это:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCustomCell", for: indexPath) as! MyCustomCell

    cell.leftLabel.text = "Left \(indexPath.row)"
    cell.rightLabel.text = "Right \(indexPath.row)"

    cell.accessoryType = (indexPath == currentSelectedIndexPath) ? .checkmark : .none

    return cell

}

Редактировать 3:

Вам нужно еще немного почитать представления таблицы, ячейки, выборки, отслеживание данных и т. Д. *

Но вот полныйпример для вас.

Сначала раскадровка.Создайте новый проект с одним представлением.Щелкните правой кнопкой мыши раскадровку и выберите

Open As -> Source Code

Удалите то, что есть, и вставьте следующее:

<?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" useSafeAreas="YES" colorMatched="YES" initialViewController="KbA-Q0-LNC">
    <device id="retina4_7" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--Selected Row Table View Controller-->
        <scene sceneID="DAq-F3-sy8">
            <objects>
                <tableViewController id="qt8-QK-wnn" customClass="SelectedRowTableViewController" customModule="XC10SWScratch" 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="2Gh-42-LWt">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                        <prototypes>
                            <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="MyCustomCell" rowHeight="56" id="r8I-XK-VkK" customClass="MyCustomCell" customModule="XC10SWScratch" customModuleProvider="target">
                                <rect key="frame" x="0.0" y="28" width="375" height="56"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="r8I-XK-VkK" id="MvA-eu-x6f">
                                    <rect key="frame" x="0.0" y="0.0" width="375" height="55.5"/>
                                    <autoresizingMask key="autoresizingMask"/>
                                    <subviews>
                                        <stackView opaque="NO" contentMode="scaleToFill" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="mQ2-DJ-vUS">
                                            <rect key="frame" x="10" y="0.0" width="325" height="55.5"/>
                                            <subviews>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bfe-Sh-FxV">
                                                    <rect key="frame" x="0.0" y="0.0" width="210" height="55.5"/>
                                                    <subviews>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label 1" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Hhj-4f-3ME">
                                                            <rect key="frame" x="10" y="10" width="190" height="35.5"/>
                                                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                                    <constraints>
                                                        <constraint firstItem="Hhj-4f-3ME" firstAttribute="top" secondItem="bfe-Sh-FxV" secondAttribute="top" constant="10" id="BXa-Av-XMu"/>
                                                        <constraint firstAttribute="trailing" secondItem="Hhj-4f-3ME" secondAttribute="trailing" constant="10" id="ND3-SS-NJN"/>
                                                        <constraint firstItem="Hhj-4f-3ME" firstAttribute="leading" secondItem="bfe-Sh-FxV" secondAttribute="leading" constant="10" id="fhX-ir-pnY"/>
                                                        <constraint firstAttribute="bottom" secondItem="Hhj-4f-3ME" secondAttribute="bottom" constant="10" id="jCn-Ib-SDq"/>
                                                    </constraints>
                                                </view>
                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ydx-kR-Ui2">
                                                    <rect key="frame" x="220" y="0.0" width="105" height="55.5"/>
                                                    <subviews>
                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label 2" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vaR-rB-U1a">
                                                            <rect key="frame" x="10" y="10" width="85" height="35.5"/>
                                                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                            <nil key="textColor"/>
                                                            <nil key="highlightedColor"/>
                                                        </label>
                                                    </subviews>
                                                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                                    <constraints>
                                                        <constraint firstItem="vaR-rB-U1a" firstAttribute="top" secondItem="ydx-kR-Ui2" secondAttribute="top" constant="10" id="5LB-SK-csH"/>
                                                        <constraint firstAttribute="bottom" secondItem="vaR-rB-U1a" secondAttribute="bottom" constant="10" id="ghm-bd-7PC"/>
                                                        <constraint firstAttribute="trailing" secondItem="vaR-rB-U1a" secondAttribute="trailing" constant="10" id="rIn-3p-Lpj"/>
                                                        <constraint firstItem="vaR-rB-U1a" firstAttribute="leading" secondItem="ydx-kR-Ui2" secondAttribute="leading" constant="10" id="z1q-yz-bd6"/>
                                                    </constraints>
                                                </view>
                                            </subviews>
                                            <constraints>
                                                <constraint firstItem="ydx-kR-Ui2" firstAttribute="width" secondItem="bfe-Sh-FxV" secondAttribute="width" multiplier="0.5" id="4h1-AF-V9L"/>
                                            </constraints>
                                        </stackView>
                                    </subviews>
                                    <constraints>
                                        <constraint firstItem="mQ2-DJ-vUS" firstAttribute="top" secondItem="MvA-eu-x6f" secondAttribute="top" id="HNe-Ks-vip"/>
                                        <constraint firstItem="mQ2-DJ-vUS" firstAttribute="leading" secondItem="MvA-eu-x6f" secondAttribute="leading" constant="10" id="RCj-FT-gww"/>
                                        <constraint firstAttribute="bottom" secondItem="mQ2-DJ-vUS" secondAttribute="bottom" id="azO-kX-4jB"/>
                                    </constraints>
                                </tableViewCellContentView>
                                <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
                                <constraints>
                                    <constraint firstAttribute="trailing" secondItem="mQ2-DJ-vUS" secondAttribute="trailing" constant="40" id="UCo-0w-3ki"/>
                                </constraints>
                                <connections>
                                    <outlet property="leftLabel" destination="Hhj-4f-3ME" id="WQS-bJ-KeJ"/>
                                    <outlet property="rightLabel" destination="vaR-rB-U1a" id="RXC-UG-g5P"/>
                                </connections>
                            </tableViewCell>
                        </prototypes>
                        <connections>
                            <outlet property="dataSource" destination="qt8-QK-wnn" id="aMA-fV-5cb"/>
                            <outlet property="delegate" destination="qt8-QK-wnn" id="S0n-bN-MLJ"/>
                        </connections>
                    </tableView>
                    <navigationItem key="navigationItem" id="kxZ-av-xIt"/>
                </tableViewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="qxa-2p-Cxd" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="1556" y="830.73463268365822"/>
        </scene>
        <!--Navigation Controller-->
        <scene sceneID="d0B-12-bYa">
            <objects>
                <navigationController automaticallyAdjustsScrollViewInsets="NO" id="KbA-Q0-LNC" sceneMemberID="viewController">
                    <toolbarItems/>
                    <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="jcB-K3-ueL">
                        <rect key="frame" x="0.0" y="20" width="375" height="44"/>
                        <autoresizingMask key="autoresizingMask"/>
                    </navigationBar>
                    <nil name="viewControllers"/>
                    <connections>
                        <segue destination="qt8-QK-wnn" kind="relationship" relationship="rootViewController" id="YsO-wj-izb"/>
                    </connections>
                </navigationController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="5gD-zl-juz" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="616.79999999999995" y="830.73463268365822"/>
        </scene>
    </scenes>
</document>

Затем можно щелкнуть правой кнопкой мышиРаскадровка и выберите

Open As -> Interface Builder - Storyboard

для просмотра макета.

Затем замените содержимое по умолчанию ViewController.swift на этот код:

import UIKit

class MyCustomCell: UITableViewCell {

    @IBOutlet var leftLabel: UILabel!
    @IBOutlet var rightLabel: UILabel!

}

class SelectedRowTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.estimatedRowHeight = 60.0
    }

    // MARK: - Table view data source
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 30
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath)
        cell?.accessoryType = .checkmark
    }

    override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath)
        cell?.accessoryType = .none
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "MyCustomCell", for: indexPath) as! MyCustomCell

        cell.leftLabel.text = "Left \(indexPath.row)"
        cell.rightLabel.text = "Right \(indexPath.row)"

        cell.accessoryType = (tableView.indexPathForSelectedRow == indexPath) ? .checkmark : .none

        return cell

    }

}

После этого вы сможете запустить приложение.Проверьте ограничения на настраиваемую ячейку и просмотрите код (очень, очень простой), чтобы увидеть, как установлен флажок в выбранной строке (и снят в невыбранной строке), и как он установлен правильно при прокрутке.

...