【问题标题】:How to prevent subviews from resizing when parent view is transforming in Swift?当父视图在 Swift 中转换时,如何防止子视图调整大小?
【发布时间】:2021-10-14 21:08:46
【问题描述】:

我有一个圆形的父视图,在那个圆上,有 4 个子视图,它们位于父圆形视图的边缘。
单击按钮后,我使用CGAffineTransform 在父圈中缩放,它开始变小,但与此同时,子视图也在缩放和变小。

我似乎无法弄清楚,如何控制子视图以防止缩放?我尝试将autoResizeSubviews 设置为false,但它不起作用。我需要在缩放时将子视图与父视图一起移动。

当我在父视图中缩放时,我可以同时缩放子视图,但这不是我想要的行为。这里可能的解决方案是什么?任何帮助将不胜感激!

【问题讨论】:

  • 这些子视图真的需要添加为子视图吗?对于所有这些视图具有相同的父视图然后缩放您的圆形视图不会影响其他视图怎么样?还是随着圆圈变小,子视图仍需要移动,但您只想保留它们的大小?
  • 是的,子视图需要与父视图一起移动,我想保留它们的大小。请提出任何魔法。
  • 请在您的问题中添加此信息,以便在我这样做时让其他人清楚......

标签: ios arrays swift animation autoresize


【解决方案1】:

由于您的子视图需要移动但不能调整大小,因此只有部分转换应用于它们。您需要反转转换的“不需要的”部分,或者只需要提取转换的所需部分并将其仅应用于子视图。

程序 1:反转转换中“不需要”的部分

由于您的视图的位置是正确的,它们太小了,您可以通过缩放它们来增加它们的大小。

let scale: CGFloat = ...
parentView.transform = CGAffineTransform(scaleX: scale, y: scale)
subviews.forEach { $0.transform = CGAffineTransform(scaleX: 1.0/scale, y: 1.0/scale) }

程序 2:仅提取位置变化

由于您不想对子视图应用相同的转换,因此您应该将它们添加到与父视图相同的父视图中。这样,当您将转换应用于父视图时,它们根本不会改变。 要将它们移动到正确的位置,您可以将子视图的中心更改为正确的位置。有很多方便的方法...

假设您有一个子视图列表以及每个子视图的原始位置。这个位置应该是你当前每个子视图的center。然后,当您在父视图上更改转换时,类似以下内容应该正确定位这些视图:

let subviews: [(view: UIView, originalPosition: CGPoint)] = ...
    
subviews.forEach { subview, originalCenter in
    let newLocation = parentView.convert(originalCenter, to: subview.superview)
    subview.center = newLocation
}

【讨论】:

  • 好的,首先,对不起,我的问题没有说清楚,另外,我忘了告诉你我的父视图也在旋转,所以当父视图在旋转时会缩小,子视图必须也旋转。通过您的方法,我能够使子视图具有相同的大小,但是它们以线性运动的方式到达父视图中心。有什么办法可以在保持子视图大小的同时实现子视图的旋转?这将是一个巨大的人情
  • @AbuBäkr 是否有机会拍摄一段短视频并将其发布到某处并分享链接。最好同时具有预期和当前结果。有了这个 cmets,很难分辨出什么是什么。
  • 好的,我可以试试。但是试想一下,有一个父圆,在它的边缘周围,还有 4 个圆是子视图。现在父圆正在旋转,子视图也在旋转。现在当 Parent view 被变换时,它会在旋转的同时缩小尺寸,而 subviews 的尺寸也会缩小并处于旋转运动中。我只想让子视图保持旋转并跟随父圆的移动,但大小相同。
  • @AbuBäkr 认为第一个解决方案应该完成所有这些。你的结果是什么?正确的结果是什么?
  • 我甚至在发布问题之前就尝试了第一个解决方案,但这不适合 UI 情况。我尝试了您的第二种方法,但是当父视图缩小时,它并没有使子视图旋转,而是子视图线性进入,所以这个解决方案对我也不起作用。非常感谢您的时间兄弟。目前,我将使用小型子视图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多