- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在使用平移手势移动 UIStackView 中的元素后,我试图获取/保留该元素的句柄。
例如,我试图捕获的元素是按钮标签或文本标签文本。
代码解释...
我正在通过函数 func createButtonStack(label: String, btnTag: Int) -> UIStackView
创建一个 UIStackView
它包含一个按钮和一个文本标签。
创建按钮堆栈后,我将平移手势附加到它,以便我可以在屏幕上移动按钮。以下 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 上操作 centerXConstraint
和 centerYConstraint
属性。
另外,我看到您没有将 ButtonStack 上的 translatesAutoresizingMaskIntoConstraints
属性设置为 false。每当您以编程方式使用自动布局时,您都应该这样做。
关于ios - UIStackView 和手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46883229/
我有一个很大的 CustomView,我在上面放置了一个父 UIStackView 以包含两个 UIStackView。 每个 UIStackView 都设置为包含两个项目,每个项目均等填充。 第一个
我正在尝试使用嵌入式 UIStackViews 来获得如下所示的内容: Label1 ----------------Label2 Label3 -- 所以我在一个水平 UIStackView 中有
前言:我偷看了this post它并没有解决我的问题。这是一个 link to a repo这显示了我遇到的错误。 我有一个 UIViewController 和一个包含嵌套水平 UIStackVie
在上面的屏幕中,您可以看到我正在使用 UIStackView 来垂直填充单选按钮。问题是当我使用 stackV.alignment = .leading 时,我的单选按钮没有利用 UIStackVie
我想问一下 UIStackView() 和 UIStackView(frame: .zero) 初始化程序之间的区别。 我想知道这两者中的哪一个是由 UIStackView() 默认触发的。 @int
问题:图像占用了大部分堆栈,文本缩小了 我尝试更改内容拥抱优先级但没有任何更改! 如何使用 storyboard 在 UIStackview 中做到这一点? 我希望单元格看起来像 Eventbrigh
我正在尝试制作一个比使用 UICollectionView 更容易制作网格的 UIControl 来执行某些小任务。我正在使用 UIStackViews 的 UIStackView。那是垂直堆栈(列)
我有一个嵌套的 UIStackView,当我按下一个按钮时,它就会被实例化。更详细地说,我有一个 UIStackView,它遍历一个充满 CustomUIStackViews 的 NSMutableA
我目前正在尝试制作一个简单的应用程序,该应用程序将根据用户输入显示少量内容。目前,我的屏幕上有一个堆栈 View ,里面有一个 UIView。我试图做到这一点,一旦按下一个按钮,UIView 就会消失
https://spin.atomicobject.com/2017/02/20/uistackview-stacking-child-views/ 我正在按照本教程获取 View 堆叠并使用它们的内
每个 View 都有一个进行渲染的层。令我困惑的是,您无法为堆栈 View 设置圆角半径或边框,但当您隐藏其中一个已排列的 subview 时,其余 subview 会填满堆栈 View 。 此外,A
我正在尝试在堆栈 View 中排列一组按钮。但是,当我使用 for-each 循环来执行此操作时,按钮最终会被一个放在另一个的顶部? var stackView: UIStackView = {
我正在尝试将 UIStackView 添加到我的窗口,但它没有显示。如下所示,我已经成功添加了 UINavigationBar。我还尝试添加各种其他控件,但实际上只出现了另一个 UIView。我已经附
我有一个 UIStackView (stack1),它包含两个排列的 View :一个 UIStackView (stack2) 和一个 UIScrollView (scroll) stack2 有固
我需要在水平 UIStackView 中有 X 个按钮,它位于 UIScrollView 中。要求是按钮应该均匀分布在堆栈 View 中,并且随着按钮数量的增加我应该减少间距以使它们适合屏幕的宽度,但
我有一个 UIScrollView 可以填充所有窗口并且包含一个垂直的 UIStackView 我想在其中添加 UILabels 以填充所有可用宽度. UIStackView 固定在 UIScroll
在使用平移手势移动 UIStackView 中的元素后,我试图获取/保留该元素的句柄。 例如,我试图捕获的元素是按钮标签或文本标签文本。 代码解释... 我正在通过函数 func createButt
我在 Storyboard中定义了一个 UIStackView,第一个按钮的高度设置为 70,其他按钮的高度设置为 45。我收到此自动布局错误: [LayoutConstraints] Unable
问题很简单——我真的很喜欢用 UIStackView 来组织 UI。但是,我在测试应用程序中看不到 UIStackView 边界。当 UI 元素不是预期的时候,我需要花很多时间来调试。在网上搜索,我找
我正在尝试将 UIButtons 动态添加到 UIStackView,但遇到了一些奇怪的行为。由于按钮内的文本也是动态的,因此它应该是多行的(默认情况下不是)。所以我这样设置中断模式: button
我是一名优秀的程序员,十分优秀!