Ios 以编程方式定位按钮会产生意外结果

Ios 以编程方式定位按钮会产生意外结果,ios,swift,xcode,Ios,Swift,Xcode,我试图将按钮定位在UIImageView(AspectFit)中的固定位置,而UIImageView本身就位于UIScrollView中。在我的第一次尝试中,当UIScrollView和UIImageView容器都覆盖整个屏幕时,该按钮被固定在图像的某个位置,并在缩放过程中保持在该位置。您可以在下图中看到结果 正如您可以明显看到的,图像上下都有白色边框(与纵横比匹配相关),因此我必须进行一些计算,从顶部获取边距,以计算红方块的“真实”y位置。我的代码如下所示: let originalImag

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

正如您可以明显看到的,图像上下都有白色边框(与纵横比匹配相关),因此我必须进行一些计算,从顶部获取边距,以计算红方块的“真实”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(相对于图像)上。到目前为止,这个例子效果很好

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

我将代码更改为以下内容,因为大小应该根据“新”滚动视图大小计算

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
在比iPhoneX小的设备上返回的值比实际屏幕高度大,这看起来很奇怪。然后,我试图找出如何在不同的设备上找到我的scrollView的“真实”大小,因为根据模拟器的视觉结果,它显然并不比整个屏幕大

因此,不用在
viewdiload()
中执行上面引用的计算,而是在
viewdilayoutsubviews()中执行所有计算,这样就解决了整个问题

我唯一想知道的是,为什么即使在iPhoneX上也有偏移量,因为它是我在Xcode中的默认模板