图像的渲染大小与帧高度不匹配(Swift)

Posted

技术标签:

【中文标题】图像的渲染大小与帧高度不匹配(Swift)【英文标题】:Rendered Size of Image Doesn't Match Frame Height (Swift) 【发布时间】:2019-04-27 19:13:41 【问题描述】:

我提前道歉,因为这感觉很简单,但是我已经尝试了几天,但经过大量搜索后无法弄清楚。

当我检查我以编程方式创建的带有约束的图像的高度时,大小与其呈现的大小不匹配。

// Earth Image Setup
view.addSubview(earthImageView)
earthImageView.bottomAnchor.constraint(equalTo: loginTextViewTitle.topAnchor, constant: -standardSpacer).isActive = true
earthImageView.widthAnchor.constraint(equalToConstant: 500).isActive = true
earthImageView.heightAnchor.constraint(equalToConstant: 500).isActive = true
earthImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true

// Value of earthImageViewHeight is 276.  Why isn't it 500?
let earthImageViewHeight = earthImageView.frame.size.height

我看到 276 来自原始@1x 图像的像素高度。但是,我怎样才能得到实际的渲染高度呢?

我认为这可能与points vs pixels 有关,但似乎也不是这样。

【问题讨论】:

可能是因为你检查得太早了。约束是关于布局发生时要做什么的说明。它还没有发生。 你还记得把translates...设置为false吗? 是的,translatesAutoresizingMaskIntoConstraints = false 您是否也将图像视图的contentMode 设置为aspectFitaspectFill?并将其clipsToBounds 设置为true?否则,您将看到整个图像的原始大小。 是的,是的。 :) 【参考方案1】:

原因是视图尚未完全布局。布置好之后,您可以使用约束来设置其他约束,这就是上述问题背后的问题。

post 和post 很好地解释了正在发生的事情以及如何管理它。对于我的特殊情况调用...

self.view.layoutIfNeeded()

...在我的动画块开始之前,然后重新调整我正在制作动画的图像相对于另一个已经布局的图像的大小。

【讨论】:

很抱歉,但我认为说layoutIfNeeded 是愚蠢的。无需强制布局;布局在当前事务结束时发生。你知道视图的大小是多少,因为给了它限制。 现在的大小无关紧要。要做的就是等到 next 事务,after 布局发生,然后再执行下一步,无论它是什么。 你的问题没有显示或描述“我的情况”是什么。你没有告诉我们你真正想要做什么。在我看来,这是要问的问题。在您的回答中,您说“在我的动画块开始之前”,但问题中没有“动画块”。因此,不清楚您的答案与您的问题有何关联,因此这并不是一个很好的答案。 这显然不是一个很好的问题,也显然是反对票。 :)

以上是关于图像的渲染大小与帧高度不匹配(Swift)的主要内容,如果未能解决你的问题,请参考以下文章

Swift - TableViewCell 中不同大小的图像的困难

CSS:如何设置相对于父高度的图像大小?

确定占位符的大小以匹配图像的实际大小

更改 UIImageView 大小以匹配图像与 AutoLayout

如何在 Swift 中调整 UIImageView 的大小

如何将非抗锯齿字体渲染到内部图像?