gpt4 book ai didi

ios - 以编程方式定位按钮,结果出乎意料

转载 作者:行者123 更新时间:2023-11-30 11:21:02 25 4
gpt4 key购买 nike

我试图将一个按钮放置在 UIImageView (AspectFit) 内的固定位置,该按钮本身位于 UIScrollView 内。当 UIScrollView 和 UIImageView 容器都覆盖整个屏幕时,这在我的第一次尝试中效果很好,按钮被固定到图像的某个位置并在缩放期间保持在该位置。您可以在下图中看到结果。

enter image description here

正如您可以明显看到的,图像上方和下方有白色边框(与宽高比相关),因此我必须进行一些计算才能获得顶部的边距,以计算红色方 block 的“真实”y 位置。我的代码如下所示:

let originalImageSize: CGSize = CGSize(width: image.size.width, height: image.size.height)
let aspectRatio = image.size.width/image.size.height;
let requiredHeight = self.view.bounds.size.width / aspectRatio;
let screenHeight = self.view.bounds.height;
let marginTop = (screenHeight - requiredHeight) / 2;


let renderedImageSize: CGSize = CGSize(width: self.view.bounds.width, height: requiredHeight)

let x:Double = 0
let y:Double = 0

let button = UIButton()
button.frame = CGRect(x: Double(renderedImageSize.width/originalImageSize.width) * x,
y: Double(renderedImageSize.height/originalImageSize.height) * y + Double(marginTop),
width: 10, height: 10)
button.backgroundColor = UIColor.red
imageView.addSubview(button)

如您所见,我计算了“marginTop”以获得真实的 y 位置。该正方形完美位于 x: 0 和 y:0(相对于图像)。到目前为止一切顺利,这个例子运行得非常完美。

现在我创建了一个新 View ,其中包含导航栏和选项卡栏。 ScrollView 位于两者之间,不再覆盖整个屏幕,而仅覆盖导航和选项卡栏之间的区域。 imageView 的大小与我的scrollView 相同。与上面的示例几乎相同。现在我尝试再次将按钮设置为特定位置,但这一次 y 轴上有正好 6 个像素的偏移,我不知道我做错了什么。更糟糕的是,在其他设备上测试时,y 轴上的偏移量甚至大于 6 像素,而第一个示例在我测试的所有设备上都能完美运行。您可以在此处查看 y 轴值“错误”的结果。

enter image description here

基于大小应根据"new"scrollView 大小计算的事实,我将代码更改为以下内容。

let originalImageSize: CGSize = CGSize(width: image.size.width, height: image.size.height)
let aspectRatio = image.size.width/image.size.height;
let requiredHeight = scrollView.bounds.size.width / aspectRatio;
let screenHeight = scrollView.bounds.height;
let marginTop = (screenHeight - requiredHeight) / 2;


let renderedImageSize: CGSize = CGSize(width: scrollView.bounds.width, height: requiredHeight)

let x:Double = 0
let y:Double = 0

let button = UIButton()
button.frame = CGRect(x: Double(renderedImageSize.width/originalImageSize.width) * x,
y: Double(renderedImageSize.height/originalImageSize.height) * y + Double(marginTop),
width: 10, height: 10)
button.backgroundColor = UIColor.red
imageView.addSubview(button)

一个快速的解决方法是这样的,但它非常糟糕,并且不适用于其他设备尺寸,我显然想学习如何以正确的方式做到这一点:

[...] y: Double(renderedImageSize.height/originalImageSize.height) * y + Double(marginTop) - 6, [...]

我已经坐了几个小时了,仍然不知道为什么 y 轴关闭,即使上边距的计算应该是正确的,为什么 y 轴偏移现在更大不同的设备。我很感谢您的任何建议,因为我对 iOS 开发还很陌生,而且我想我误解了与计算正确大小相关的内容。

最佳答案

事实证明,我的问题的解决方案相当简单。当我看到 scrollView.bounds.size.height 时,我第一次开始想知道在小于 iPhone X 的设备上返回的值比实际屏幕高度更大,这看起来很奇怪。然后我尝试找出如何在不同设备上找到我的scrollView的“真实”大小,因为根据模拟器的视觉结果,它显然并不比整个屏幕大。

因此,我不是在 viewDidLoad() 中进行上述引用的计算,而是在 viewDidLayoutSubviews() 中进行所有计算,这解决了整个问题。

我仍然想知道的唯一一件事是,为什么即使在 iPhone X 上也存在偏移,因为它是我在 Xcode 中的默认模板。

关于ios - 以编程方式定位按钮,结果出乎意料,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51268981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com