首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIStackView &手势

UIStackView &手势
EN

Stack Overflow用户
提问于 2017-10-23 06:31:54
回答 1查看 1.2K关注 0票数 0

在用pan手势移动元素之后,我正在尝试获取/保留UIStackView中元素的句柄。

例如,我试图获取句柄的元素是像按钮标签或文本标签文本这样的东西。

代码解释了…

我正在通过函数UIStackView创建一个func createButtonStack(label: String, btnTag: Int) -> UIStackView

它包含一个按钮和一个文本标签。

在创建按钮堆栈时,我会附加一个pan手势,这样我就可以在屏幕上移动按钮。以下3点起作用。

  1. 我创建了按钮堆栈
  2. 我可以按下按钮,并打电话给乐趣打印我的信息。
  3. 我可以移动按钮堆栈。

我的问题是…

一旦我第一次移动按钮堆栈并触发if语句gesture.type == .ended行,我就失去了对按钮堆栈的控制。

也就是说,按钮不再工作,我也不能再移动它了。

有人能帮忙吗?谢谢

代码语言:javascript
复制
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .lightGray

        let ButtonStack = createButtonStack(label: “Button One”, btnTag: 1)

        view.addSubview(ButtonStack)

        ButtonStack.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
        ButtonStack.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true

        let panGuesture = UIPanGestureRecognizer(target: self, action: #selector(pan(guesture:)))

        ButtonStack.isUserInteractionEnabled = true
        ButtonStack.addGestureRecognizer(panGuesture)
    }

    func createButtonStack(label: String, btnTag: Int) -> UIStackView {

        let button = UIButton()
        button.setImage( imageLiteral(resourceName: "star-in-circle"), for: .normal)
        button.heightAnchor.constraint(equalToConstant: 100.0).isActive = true
        button.widthAnchor.constraint(equalToConstant: 100.0).isActive = true
        button.contentMode = .scaleAspectFit
        button.tag = btnTag

        switch btnTag {
        case 1:
            button.addTarget(self, action: #selector(printMessage), for: .touchUpInside)
        case 2:
            break
        default:
            break
        }

        //Text Label
        let textLabel = UILabel()
        textLabel.backgroundColor = UIColor.green
        textLabel.widthAnchor.constraint(equalToConstant: 100.0).isActive = true
        textLabel.heightAnchor.constraint(equalToConstant: 25.0).isActive = true
        textLabel.font = textLabel.font.withSize(15)
        textLabel.text = label
        textLabel.textAlignment = .center

        //Stack View
        let buttonStack = UIStackView()
        buttonStack.axis  = UILayoutConstraintAxis.vertical
        buttonStack.distribution  = UIStackViewDistribution.equalSpacing
        buttonStack.alignment = UIStackViewAlignment.center
        buttonStack.spacing   = 1.0

        buttonStack.addArrangedSubview(button)
        buttonStack.addArrangedSubview(textLabel)
        buttonStack.translatesAutoresizingMaskIntoConstraints = false

        return buttonStack
    }

   @objc  func printMessage() {
        print(“Button One was pressed”)
    }

    @objc func pan(guesture: UIPanGestureRecognizer) {
        let translation = guesture.translation(in: self.view)

        if let guestureView = guesture.view {
            guestureView.center = CGPoint(x: guestureView.center.x + translation.x, y: guestureView.center.y + translation.y)

            if guesture.state == .ended {                
                print("Guesture Center - Ended = \(guestureView.center)")
            }
        }
        guesture.setTranslation(CGPoint.zero, in: self.view)
    }
EN

回答 1

Stack Overflow用户

发布于 2017-10-29 05:02:12

感谢PGDev和医院对他们的投入。这两种方法都为我提供了一个洞察力,让我弄清楚了这个问题。

我的代码只使用一个按钮,但我的项目在UIStackView中有三个按钮。

一旦我移动了一个按钮,它实际上破坏了UIStackView,我失去了对移动按钮的控制。

这里的解决方法是将三个按钮从UIStackView中删除,现在我可以移动和控制所有三个按钮,而不会出现问题。

至于在按钮/文本字段UIStackView上保留句柄,这是通过向UIStackView添加一个.tag来实现的。

一旦移动了元素,pan的.ended操作就可以访问.tag,因此允许我识别哪个按钮堆栈被移动了。

再次感谢您的所有投入。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46883229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档