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

时间:2018-07-10 15:22:30

标签: ios swift xcode

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

enter image description here

您可以很明显地看到图像的上方和下方(与宽高比相关)有白色边框,因此我必须进行一些计算才能从顶部获得边距,从而计算出红色正方形的“实际” 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轴值错误的结果。

enter image description here

基于大小应根据“新” 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开发还很陌生,我想我对与计算正确大小有关的事情误解了。

1 个答案:

答案 0 :(得分:0)

结果证明,解决我的问题的方法非常简单。我首先想知道何时看到scrollView.bounds.size.height 在小于iPhone X的设备上返回的值大于实际屏幕高度,这似乎很奇怪。然后,我试图找出如何在不同设备上找到我的scrollView的“实际”大小,因为根据模拟器的视觉结果,它实际上并不比整个屏幕大。

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

我唯一仍然想知道的是,为什么iPhone X上会有偏移,因为它是Xcode中的默认模板。