Swift:UIControls 的 UIStackView 具有不触发的选择器方法

2024-01-07

介绍

我正在创建一个使用自定义视图的应用程序,其中我有一个 UIStackView 来整理 5 个 UIControl。当用户点击其中一个 UIControl 时,下划线会变为动画,并在点击的 UIControl 下方滑动。

但是,由于某种原因,这些 UIControl 的方法/选择器不再被调用。我相信这与我将 Mac 更新到本周发布的 macOS(和 Xcode)更新(第 44 周)有关。 (从 swift 4.2 更新到 swift 4.2.1)。在更新之前,这个动画和选择器工作得很好。但我不确定。我现在完全陷入了我做错的事情中。

Context

  • 我创建了一个游乐场并尽可能缩小了所有内容,但问题仍然存在。

  • 我试图在我的全局范围内定义 UIStackViewSetupView类,但它不会改变任何东西。所以我相信这不是 stackView 或其子视图被释放的问题?

  • 下面我提供了我的 UIControl 子类和我的SetupView我使用的(UIView 子类)。我已经创建了一个 Playground,因此您可以在 Xcode Playground 中复制粘贴来测试是否需要。

Question

  • 为什么没有方法goalViewControlTapped(_ sender: SetupViewControl)接到电话吗?

Code

import UIKit
import PlaygroundSupport

class SetupViewControl: UIControl {

    let titleLabel : UILabel = {
        let lbl = UILabel()
        lbl.font = UIFont(name: "Futura", size: 14)
        lbl.textColor = .white
        lbl.backgroundColor = .clear
        lbl.textAlignment = .center
        lbl.translatesAutoresizingMaskIntoConstraints = false
        return lbl
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupLabel()
        layer.cornerRadius = 5
    }

    fileprivate func setupLabel() {
        addSubview(titleLabel)
        titleLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 5).isActive = true
        titleLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -5).isActive = true
        titleLabel.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override var isHighlighted: Bool {
        didSet {
            UIView.animate(withDuration: 0.12) {
                self.backgroundColor = self.isHighlighted ? UIColor.lightGray : UIColor.clear
            }
        }
    }
}

class SetupView: UIView {

    let dataModel : [String] = ["2 weeks", "1 month", "2 months", "6 months", "1 year"]
    var selectionLineCenterX : NSLayoutConstraint!

    let selectionLine = UIView()
    let labelZero = SetupViewControl()
    let labelOne = SetupViewControl()
    let labelTwo = SetupViewControl()
    let labelThree = SetupViewControl()
    let labelFour = SetupViewControl()
    let labelFive = SetupViewControl()

    lazy var controlArray = [self.labelZero, self.labelOne, self.labelTwo, self.labelThree, self.labelFour, self.labelFive]

    init(frame: CGRect, color: UIColor) {
        super.init(frame: frame)
        self.backgroundColor = color
        setupView()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    fileprivate func setupView() {
        layer.cornerRadius = 0
        layer.borderColor = UIColor.black.cgColor
        layer.borderWidth = 1
        setupLabelText()
        setupControlsInStackView()
    }

    fileprivate func setupLabelText() {
        for num in 0...(dataModel.count - 1) {
            controlArray[num].titleLabel.text = dataModel[num]
        }
    }

    // let stackView = UIStackView(frame: .zero) I have tried to declare the stackView here but it doesn't fix my issue.
    func setupControlsInStackView() {
        var stackViewArray = [SetupViewControl]()
        for num in 0...(dataModel.count - 1) {
            controlArray[num].isUserInteractionEnabled = true
            controlArray[num].addTarget(self, action: #selector(goalViewControlTapped(_:)), for: .touchUpInside)
            stackViewArray.append(controlArray[num])
        }
        let stackView = UIStackView(arrangedSubviews: stackViewArray)
        stackView.alignment = .fill
        stackView.distribution = .fillEqually
        stackView.axis = .horizontal
        stackView.translatesAutoresizingMaskIntoConstraints = false
        addSubview(stackView)
        stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8).isActive = true
        stackView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8).isActive = true
        stackView.topAnchor.constraint(equalTo: topAnchor, constant: 15).isActive = true

        addSubview(selectionLine)
        selectionLine.backgroundColor = .white
        selectionLine.translatesAutoresizingMaskIntoConstraints = false
        selectionLine.heightAnchor.constraint(equalToConstant: 1).isActive = true
        selectionLine.topAnchor.constraint(equalTo: stackView.bottomAnchor).isActive = true
        selectionLine.widthAnchor.constraint(equalToConstant: 50).isActive = true
        selectionLineCenterX = selectionLine.centerXAnchor.constraint(equalTo: leadingAnchor, constant: -100)
        selectionLineCenterX.isActive = true
    }

    @objc fileprivate func goalViewControlTapped(_ sender: SetupViewControl) {
        print("This is not getting printed!!!")
        selectionLineCenterX.isActive = false
        selectionLineCenterX = selectionLine.centerXAnchor.constraint(equalTo: sender.centerXAnchor)
        selectionLineCenterX.isActive = true
        UIView.animate(withDuration: 0.25, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0.5, options: .curveEaseIn, animations: {
            self.layoutIfNeeded()
        }, completion: nil)
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        let testView = SetupView(frame: .zero, color: UIColor.blue)
        view.addSubview(testView)
        testView.translatesAutoresizingMaskIntoConstraints = false
        testView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        testView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        testView.heightAnchor.constraint(equalToConstant: 100).isActive = true
        testView.widthAnchor.constraint(equalToConstant: 365).isActive = true
    }
}
// For live view in playground
let vc = ViewController()
vc.preferredContentSize = CGSize(width: 375, height: 812)
PlaygroundPage.current.liveView = vc

感谢您阅读我的问题。


请问您UIStackView当您打开视图调试器时显示为具有不明确的布局?如果是这样,可能会导致内部视图无法接收触摸事件。

您可以提供UIStackView与以下任一:

x and y仅约束

or

x, y, width and height.

在上述情况下height缺少约束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift:UIControls 的 UIStackView 具有不触发的选择器方法 的相关文章

随机推荐

  • 没有完整堆栈框架的 Symfony 组件

    我在我的项目中使用 Symfony DI Http Kernel Routing 创建您自己的 PHP 框架 https symfony com doc current create framework index html https s
  • 连接两个docker容器

    我有两个容器 第一个带有django第二个是postgresql 好吧 在我的第一个服务器中我运行了django我正在尝试将它与第二个联系起来 第二个容器有端口32770暴露但在端口内部运行5432 在我的本地机器上 我有连接 服务器 本地
  • 如何在 Oracle PLSQL 中透视表?

    我有一个表格如下 KEY 1995 1996 1997 1998 1999 2000 2001 2002 2003 123 0 0 0 461 1188 2049 1056 377 295 我希望数据可见 如下所示 KEY SEQ NBR
  • 即使侧边栏在 SwiftUI 中打开,如何使视图全屏?

    Goal 与地图应用程序一样 当侧边栏打开时 视图显示为全帧大小 视图位于侧边栏下方 我尝试过的 为了最大化视图的大小 我将大小设置为无穷大并添加视图修饰符 ignoresSafeArea 但它仍然不像地图那样全画幅 当我打开侧边栏时 你会
  • Hibernate、Spring 和 MySQL:无法将字符集设置为 UTF-8

    我对 Hibernate 和 Spring 有一个问题 我无法在任何地方使用 UTF 8 字符集 并且我对重音字母有一些问题 例如 这是我的数据库创建的一部分 Dropping and creating database again DRO
  • 将颜色从 CSS 转换为 javafx 颜色对象

    我想知道是否可以转换 CSS 中定义的颜色 例如 root my blue rgb 50 100 200 转换为 JavaFX 中的颜色对象 例如 通过 CSS 定义 我可以在节点上使用 setStyle 来设置其颜色 label1 set
  • Hibernate Validator:将验证限制为给定的约束

    我想分两步执行我的实体的验证 虽然我在保存到数据库之前使用 defaultValidatorFactory 来验证实体的所有字段 但我想在前面的步骤中对实体执行部分验证 但我找不到配置我的验证器 或 validatorFactory 的方法
  • reportlabs 中的 Python 饼图

    我指的是这个链接 http www reportlab com snippets 4 用于生成饼图 在此 每个数据的颜色都是预先定义的 即 10 个数据点有 10 种颜色 如果我有 11 个数据点 那么第 11 个数据点将没有颜色怎么办 我
  • 在Winforms中显示动画gif而不锁定文件

    我正在尝试显示各种文件类型的图像 包括动画 gif文件 在我的 Winforms 应用程序中 我也必须能够修改显示的文件 更改文件名 删除它们 问题是一个Picturebox 锁定图像文件 直到应用程序关闭 http support mic
  • Spark 作业在活动阶段显示未知且卡住

    我正在运行 Spark 作业来计算交互 映射后 我按我想要的键进行分组 Spark 保持在挂起状态 而不显示任何错误和阶段的未知信息 我想知道可能是什么原因导致的以及如何检查它 因为我在本地运行并且这是正常的 检查日志没有错误信息 6 01
  • 测试 R 中是否设置了函数的参数

    我有一个函数f它需要两个参数 p1 and p2 如果对于参数p2没有值传递给函数 值p1应使用 2 代替 但是我怎样才能在函数中找出是否给定了值 问题是变量p2如果没有值则不会初始化 因此我无法测试p2 being NULL f lt f
  • 将 fullcalendar 导出到 google calendar、ical 等

    是否可以将 FullCalendar 事件导出到 google 日历或 ical 中 尝试这个 http michalkorecki com content introducing json xml jquery plugin https
  • SQL Server (localdb)\v11.0 解释

    我正在跟进Code First 到现有数据库 http msdn microsoft com en us data jj200620教程并注意到它建议连接到 localdb v11 0出于学习目的 我尝试使用 SQL Management
  • 使用 ARCORE 将图像放置在墙上

    I want to place an image on the wall with ARCore The image is converted from a regular image view I only detect vertical
  • 单个 CASE 语句中的多个列

    我确信这已经被讨论过很多次了 所以请原谅我的重复 我有一个有效的查询 但当前在一个选择中有 6 个 CASE 语句 有人提到 最好的优化方法是将所有 WHEN 条件放在一个 CASE 中 但是 我无法实现这一点 select right R
  • 如何更改 VS Code 状态栏中 >< 远程图标的颜色?

    我安装了 VS Code远程开发扩展 https code visualstudio com docs remote remote overview但绿色 gt lt 状态栏左侧的图标不太适合我喜欢的主题 我如何改变它的颜色 The gt
  • Google App Engine 错误: INVALID_ARGUMENT:超出了以下配额:BACKEND_SERVICES(配额:5,已用:5 + 需要 1)

    我正在尝试在 Google App Engine 灵活环境上部署我的节点应用程序 以前它运行良好 但昨天它开始拒绝给出此错误 错误 INVALID ARGUMENT 以下配额是 超出 BACKEND SERVICES 配额 5 已用 5 需
  • 记录 mysql 中的所有查询

    我可以在 mysql 数据库上打开审核日志记录吗 我基本上想监视一个小时的所有查询 并将日志转储到文件中 除了我在这里遇到的情况之外 运行以下命令是将查询转储到日志文件而无需重新启动的最简单方法 SET global log output
  • 谷歌应用程序引擎 JDO 3

    Google 刚刚为 Google App Engine 推出了 JDO 3 0 它使用 DataNucleus 2 0 我想使用它 因为它可以方便地支持无主关系 我已经尝试了好几天了 但我不知道如何将它与 Google Eclipse 插
  • Swift:UIControls 的 UIStackView 具有不触发的选择器方法

    介绍 我正在创建一个使用自定义视图的应用程序 其中我有一个 UIStackView 来整理 5 个 UIControl 当用户点击其中一个 UIControl 时 下划线会变为动画 并在点击的 UIControl 下方滑动 但是 由于某种原