将一个 UIView 的约束交换到另一个 UIView

Swap constraints of one UIView to another UIView

我有一个应用程序有一定数量的 UIViews。我现在需要水平交换他们的位置。比如左端有一个叫XUIView,右端有一个叫Y的。单击按钮,我希望 Y 位于 X 所在的位置,而 X 位于 UIView Y的初始位置。我想,我必须能够通过交换它们的 NSLayoutConstraints 来做到这一点(只是一个猜测)。但我无法让它发挥作用。这个想法可能吗? objective-C 代码是什么?

这些是我尝试第一个代码后得到的结果(几乎是,但不完全)。我只将它应用于视图 KWIDXB。我想要的是 KWIDXB

之间的盲调

如果视图大小相同,则问题不大。假设您的两个视图 X 和 Y 分别称为 xView 和 yView。你可以这样做:

CGRect xViewFrame = xView.frame;
UIViewAutoresizing xViewResizingConstraints = xView.autoresizingMask;
xView.frame = yView.frame;
xView.autoresizingMask = yView.autoresizingMask;
yView.frame = xViewFrame;
yView.autoresizingMask = xViewResizingConstraints;

如果你想要这个动画,你可以把它放在一个 [UIView animateWithDuration: animations:^{}] 块中,它应该可以工作。 (虽然我还没有测试过)

您还可以将 CGRect xViewFrame 更改为使用 CGPoint xViewCenter 并将中心交换为相同大小的视图。

属性 autoresizingMask 告诉程序在屏幕调整大小的情况下要做什么 - 无论是由于方向改变,还是由于设备屏幕尺寸或任何其他原因。

如果视图大小不同,您将不得不处理视图的适当边距,并确保它们不会被剪裁到屏幕之外。

希望对您有所帮助。

编辑

您似乎将 UILabel 用作您的视图或两个视图的子视图。如果是这种情况,请确保您还交换了 UILabel 的 NSTextAlignment。像这样:

NSTextAlignment xTextAlignment = xView.titleLabel.textAlignment;
xView.titleLabel.textAlignment = yView.titleLabel.textAlignment;
yView.titleLabel.textAlignment = xTextAlignment;