【问题标题】:iOS Swift Setting View Frame Position ProgrammaticallyiOS Swift以编程方式设置视图框架位置
【发布时间】:2017-09-25 02:44:54
【问题描述】:

我在滚动视图中有两个子视图。我需要以编程方式定位这两个子视图。我通过在DispatchQueue.main.async 中编写代码正确地做到了这一点。代码如下:

DispatchQueue.main.async {
    self.SelectClientDetailView.frame = CGRect(x: 0, y: 637, width: self.SelectClientDetailView.frame.size.width, height: self.SelectClientDetailView.frame.size.height)
    self.SelectClientDetailView2.frame = CGRect(x: 0, y: 837, width: self.SelectClientDetailView2.frame.size.width, height: self.SelectClientDetailView2.frame.size.height)
}

它工作得很好,但是当我滚动我的滚动视图时,这两个视图都回到了旧位置。如何修复它。它的默认y 位置将是SelectClientDetailView:400 和SelectClientDetailView2:600

【问题讨论】:

  • 您确定将视图添加到 scrollView 而不是视图?
  • @7to4 ya 这两个视图都在滚动视图内

标签: ios swift uiscrollview uikit cgrect


【解决方案1】:

如果您使用自动布局,那么设置框架会导致一些奇怪的效果。自动布局和框架不能一起使用。您需要重新排列约束,而不是框架。在使用自动布局时,更改框架会导致一些奇怪的效果,最终会恢复到您在原始 UIView 中创建的约束。

一些解决方案:

  1. 如果您想使用 Autolayout 方法,您需要像创建视图一样为每个约束创建一个出口,并在需要时更改其常量。
  2. 禁用该特定 xib 中的自动布局并开始播放帧。

【讨论】:

  • 很高兴知道这一点:)
【解决方案2】:

如果您只想更改 frame Y 位置,请尝试以下操作:

self.SelectClientDetailView.frame.origin.y = 637
self.SelectClientDetailView.frame.origin.y = 837

如前所述,您可能需要检查您的视图层次结构,以确保您确实将它们添加到UIScrollView(而不是其他地方)。

【讨论】:

  • 它可以工作,但是当我滚动我的滚动视图时,两个视图都回到了旧位置
  • @KavinKumarArumugam 您在哪里运行问题中的框架设置代码?
  • 内部viewDidAppear
  • @KavinKumarArumugam 如果它在该函数内(并且 not 在闭包内),那么您可以安全地删除 DispatchQueue.main.async 包装器 - 您已经在主线程上 :)
猜你喜欢
  • 2017-09-16
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
相关资源
最近更新 更多