大家好,对不起我的英语,我正在开发一个应用程序,它能够移动一堆按钮,每个按钮在屏幕上都有UIPanGestureRecognizer
,保存中心位置(x,y)和Core Data
中的标签。
当应用程序从零开始,并且我从Core Data
加载位置时:
if let c = ButtonEntity.getButton(tag: self.tag)
{
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
{
self.center = CGPoint(x: CGFloat( c.xPoint ?? 0), y: CGFloat( c.yPoint ?? 0))
}
这来自自定义UIButton
类,默认情况下,按钮放置在auto layout
的特定位置
问题是,在某些情况下,某些按钮会返回到其auto layout
位置,而不是返回到viewDidLoad
上分配的coreData
中心位置
有什么解决方案或其他方法来做到这一点吗?谢谢
1条答案
按热度按时间vkc1a9a21#
为了帮助理解为什么我们不能将约束与
.center
(帧)更改混合...下面是两个几乎相同的视图控制器。
每个都添加一个按钮,并将按钮的
.centerXAnchor
和.centerYAnchor
设置为视图的.centerXAnchor
和.centerYAnchor
。我们将平移手势添加到按钮,以便可以四处拖动它。
我们还实现了
touchesBegan(...)
,我们所做的只是改变按钮标题,这样做将触发一个自动布局通道。在第一个示例的平移函数中,我们使用了一个典型的“获取平移位置并更新
.center
属性:这样做很好,直到我们点击按钮的任何位置。在这一点上,我们改变按钮的标题和自动布局移动按钮回到它的中心X和Y约束。
在第二个示例中,我们将X和Y约束作为var /属性添加到控制器:
在
viewDidLoad()
中设置它们,然后在平移手势中 * 移动按钮 *,如下所示:现在,点击其他任何地方将更改按钮标题,但它将保持不变,因为我们已经更改了X和Y约束的
.constant
值。设置
.center
--问题更新约束
.constant
值--没有问题