【问题标题】:Multiple Labels displayed programmatically以编程方式显示多个标签
【发布时间】:2022-01-24 00:12:08
【问题描述】:

我是 Swift 的新手,我想学习如何以编程方式并排显示六个标签。我有显示单个对象的代码,但我不知道如何为更多对象扩展它。我的代码如下


class ViewController: UIViewController {
    
    // MARK: - Properties
    
    private var label1: CGPoint = CGPoint(x: 1000, y: 100)
    private var label2: CGPoint = CGPoint(x: 150, y: 150)
    private var label3: CGPoint = CGPoint(x: 200, y: 200)
    private var label4: CGPoint = CGPoint(x: 250, y: 250)
    private var label5: CGPoint = CGPoint(x: 300, y: 300)
    private var label6: CGPoint = CGPoint(x: 350, y: 350)
    
    // MARK: - View Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        // Add to View Hierarchy
        view.addSubview(pannableView) //This creates the object, how to send more than one object

        pannableView.center = view.center
        
        
        // Initialize Swipe Gesture Recognizer
        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(didPan(_:)))
        
        // Add Swipe Gesture Recognizer
        pannableView.addGestureRecognizer(panGestureRecognizer)
    }
    
    // MARK: -
    private let pannableView: UIView = {
        // Initialize View
        let view = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 80.0, height: 80.0))) //How big the object is
        
        // Configure View
        view.backgroundColor = .blue
        view.translatesAutoresizingMaskIntoConstraints = false
        
        return view
    }()
    
    // MARK: - Actions
    @objc private func didPan(_ sender: UIPanGestureRecognizer) {
        switch sender.state {
        case .began:
            label1 = pannableView.center
            
        case .changed:
            let translation = sender.translation(in: view)
            
            pannableView.center = CGPoint(x: label1.x + translation.x,
                                          y: label1.y + translation.y)
        default:
            break
        }
    }
}

我假设我需要定义我所做的所有标签,但是当它进入 pannableView 时,它只会显示“label1”。我看过一些涉及制作表格的帖子,但我认为这不起作用,因为我需要将标签拖到整个屏幕上。非常感谢任何建议。

【问题讨论】:

  • 你的代码是一团乱麻。您有一堆名为 label1、label2 的变量,它们不包含标签,它们包含 CGRect 值。您似乎从未使用最初放入这些变量中的值,然后您只对变量label1 做某事。您有一个设置为包含单个 UIView 的 var pannableView。您有将平移手势识别器添加到单个 pannableView 的代码。你没有告诉我们那个平移手势识别器应该做什么。用户是否应该能够在屏幕上拖动视图?
  • 您需要为自己明确定义您想要做什么,然后如果我们要帮助您实现它,您需要在您的问题中解释这一点。
  • @DuncanC,我为我的混乱代码道歉;我还在快速学习。要回答您的问题,是的,用户应该在屏幕上拖动视图。正如您所提到的,我不使用我坚持使用的其他变量。 pannableView 只包含一个 UIView,但我不知道如何扩展它以包含多个 UIView。我将如何做到这一点?
  • 您希望标签视图最初如何在屏幕上布局?此外,如果您希望它们的位置在用户拖动它们时“粘住”,您将需要让您的代码调整它们的布局约束。
  • @DuncanC 基本上,我希望它们最初位于屏幕的右侧,然后可以拖动到任何地方。如果你能让我知道如何让 pannableView 包含多个 UIView,那将是一个很好的第一步。我不指望你给我一切。尽管let view = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 80.0, height: 80.0))) 似乎确实忽略了这一点,并且在我运行程序时将 UIView 对象放在了中心,但我已经确定了顶部的 CGPoint

标签: ios swift label viewdidload


【解决方案1】:

我认为你应该使用 UIKit 的 UIStackView 或 UICollectionView。 如果您想从头开始创建堆栈视图以供学习,则应创建继承自 UIView 的 YourOwnStackView 类,并在其中约束排列子视图。

【讨论】:

  • OP 希望用户能够在屏幕上拖动标签。堆栈视图不适用于此。
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多