Xcode:AccessoryType.checkmark将其他视图向左推

时间:2019-04-18 12:41:59

标签: ios swift xcode uitableview accessorytype

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设置为“填充”
  • 第二个子视图的宽度是第一个子视图的一半
  • 左侧领先10点,右侧领先40点(也已经测试了100点,但没有变化)

创建它们时,我已经尝试在每行中添加一个AccessoryType.none(如建议的here),如下所示:

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的同时是否可以将复选标记设置在其他所有内容的“后面”?

2 个答案:

答案 0 :(得分:1)

在创建用于处理单元格的UITableViewCell内,添加以下功能。此函数测试此当前单元格是否设置了annexType,如果不是,则使该单元格缩小40pts,从而使具有和不具有附件的单元格具有相同的自动布局大小。

override var frame: CGRect {
    get {
        return super.frame
    }
    set (newFrame) {
        var frame = newFrame
        if self.accessoryType == .none {
            frame.size.width -= 40
        }
        super.frame = frame
    }
}

答案 1 :(得分:-1)

有很多解决方法,但是我认为最好的方法是将图像视图添加到自定义单元格并使用自己的选中标记图像。

enter image description here

然后,当您在cellForRowAt中设置标签的文本时,而不是在需要的地方设置cell.accessoryType = .checkmark,而是将图像视图的图像设置为自己的选中标记图像(或将图像视图设置为{{ 1}}至.alpha(未显示)或0(未显示)):

enter image description here

当然,您将使用自己的更好的选中标记图像,比我在此示例中抓取的图像要好:)

编辑:

如果要使用淡色,可以将图像设置为“模板”图像。在您的单元格初始化中是这样的:

1

编辑2:

如果您不想使用自定义图片,则可以将堆栈视图的后缘限制为单元格,而不是单元格的 Content View

enter image description here

40点看上去不错,但是您需要确认这一点,并且还要仔细检查不同设备(视网膜与非视网膜等)上的间距是否相同。

此外,设置附件的正确方法是将其设置在 checkImageView.image = checkImageView.image?.withRenderingMode(.alwaysTemplate) checkImageView.tintColor = .red 中的单元格上。假设(基于您的评论)您正在保留对选定行的引用-假设它是

cellForRowAt

您想要执行以下操作:

var currentSelectedIndexPath: IndexPath!

修改3:

您需要阅读更多有关表视图,单元格,选择,数据跟踪等内容的信息。

但是,这是一个完整的示例。

首先,情节提要。创建一个新的单视图项目。右键单击情节提要,然后选择

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 }

删除其中的内容,然后粘贴以下内容:

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

然后您应该能够运行该应用程序。检查自定义单元格上的约束,并检查代码(非常基本),以了解如何在选中的行上设置选中标记(并在未选中的行上删除选中标记),以及滚动时如何正确设置选中标记。