Swift:更改 UIView 框架但显示不更新

sh3*_*211 5 frame uiview uiimageview ios swift

我正在尝试动态调整 UIView 框架的大小。我可以更新代码中的框架并看到值已更改,但实际显示永远不会更改,即使我运行 setNeedsDisplay() 也是如此。

我正在关注这篇文章,其中我通过 CGRectMake 定义了一个新框架,然后将 UIView 的框架设置为这个新框架。即,我正在这样做...

let newFrame = CGRectMake(minX,minY, width, height)
VUBarCover.frame = newFrame
Run Code Online (Sandbox Code Playgroud)

如果我打印出 UIView 框架的值,我会看到它正在按照我的意愿变化。但显示器(在模拟器中)永远不会反映这些变化。

知道如何解决这个问题吗?

更新:更详细地说:我正在尝试以编程方式用另一个 UIView 掩盖一个 UIView。它是一个水平的“VU Meter”,由显示颜色渐变的基本 UIImageView 组成,部分被黑色背景的 UIView 动态“覆盖”。UIImageView“VUBarImageView”在 StoryBoard 中定义,并受 AutoLayout 约束。黑色 UIView“VUBarCover”纯粹以编程方式定义,没有自动布局约束。

这是代码完整性的相关部分...我遇到的问题是 updateVUMeter()...

let newFrame = CGRectMake(minX,minY, width, height)
VUBarCover.frame = newFrame
Run Code Online (Sandbox Code Playgroud)

样本结果是:

val =  0.9177
fullWidth =  285.0 width =  23.4556210041046
newFrame =  (278.544378995895, 93.5, 23.4556210041046, 10.0) VUBarCover.frame =  (278.544378995895, 93.5, 23.4556210041046, 10.0)
val =  0.878985
fullWidth =  285.0 width =  34.4891595840454
newFrame =  (267.510840415955, 93.5, 34.4891595840454, 10.0) VUBarCover.frame =  (267.510840415955, 93.5, 34.4891595840454, 10.0)
val =  0.955011
fullWidth =  285.0 width =  12.8218790888786
newFrame =  (289.178120911121, 93.5, 12.8218790888786, 10.0) VUBarCover.frame =  (289.178120911121, 93.5, 12.8218790888786, 10.0)
Run Code Online (Sandbox Code Playgroud)

...即,我们看到 VUBarCover.frame 正在“内部”更改,但在屏幕上它永远不会更改。相反,我们看到的是全尺寸的封面,完全覆盖了下面的图像(约 300 像素宽),尽管其宽度应该仅为约 12 像素)。

即使我在 VUBarCover 的超级视图上执行 setNeedsDisplay() ,也不会发生任何变化。

帮助?谢谢。

Aar*_*ger 5

首先,有几个值得注意的错误:

  • 实例变量(如VUBarCover和 )MainView应始终以小写字母开头(如mainView)。
  • super.viewDidLayoutSubviews()您应该在覆盖实施开始时调用

其次,viewDidLayoutSubviews()可以被调用任意多次,因此该方法的实现应该是幂等的,这意味着无论调用多少次,它都具有相同的效果。但是当你打电话时:

VUBarCover = UIView(frame: frame)
MainView.addSubview(VUBarCover)
Run Code Online (Sandbox Code Playgroud)

您正在创建一个 UIView视图并将其与您过去可能添加的其他视图一起添加到视图层次结构中。所以看起来框架没有在屏幕上更新。事实上,您只是无法分辨,因为视图位于您正在更新的视图后面,并且它们没有改变。

相反,您可能想创建一次:

var vuBarCover = UIView()
Run Code Online (Sandbox Code Playgroud)

将其添加为子视图viewDidLoad()

mainView.addSubview(vuBarCover)
Run Code Online (Sandbox Code Playgroud)

并修改其框架viewDidLayoutSubviews()

vuBarCover.frame = vuBarImageView.frame
Run Code Online (Sandbox Code Playgroud)

你不需要打电话setNeedsDisplay()