gpt4 book ai didi

ios - UIStackView 和手势

转载 作者:行者123 更新时间:2023-11-29 00:09:40 26 4
gpt4 key购买 nike

在使用平移手势移动 UIStackView 中的元素后,我试图获取/保留该元素的句柄。

例如,我试图捕获的元素是按钮标签或文本标签文本。

代码解释...

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

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

创建按钮堆栈后,我将平移手势附加到它,以便我可以在屏幕上移动按钮。以下 3 点起作用。

  1. 我创建了按钮堆栈
  2. 我可以按下按钮并调用 fun 来打印我的消息。
  3. 我可以移动按钮堆栈。

我遇到的问题是……

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

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

有人可以帮忙吗?谢谢

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)
}

最佳答案

如果您在 buttonStack 上使用自动布局,则无法直接操作 guestureView.center centerX。您必须使用约束才能实现拖动效果。因此,代替 ButtonStack.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true,您应该按照以下方式做一些事情:

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

要这样做,您应该在 ButtonStack 类上声明一个类型为 NSLayoutConstraint 的弱属性。您可以对 centerY 约束执行相同的操作。

之后,在 func pan(guesture: UIPanGestureRecognizer) 方法中,您可以直接在 ButtonStack View 上操作 centerXConstraintcenterYConstraint 属性。

另外,我看到您没有将 ButtonStack 上的 translatesAutoresizingMaskIntoConstraints 属性设置为 false。每当您以编程方式使用自动布局时,您都应该这样做。

关于ios - UIStackView 和手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46883229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com