在我的应用程序中,我有一个国家列表。我希望用户能够点击其中一个国家(A 按钮),然后它会在所述 map 上放大到那个国家。我有来自原始 png 文件的坐标,但是当我将这些坐标乘以 scrollViews 帧大小(宽度或高度)除以 imageViews 图像大小(宽度或高度)到 contentOffSet 时,它不会将自己定位到我选择的国家。
这是我目前所拥有的:
出于测试目的,我将坐标设置为变量。这些将根据用户的选择而改变。同样出于测试目的,我这样做是为了在加载 View 时自动运行单击阿富汗按钮时将运行的代码。
@IBOutlet var scrollView: UIScrollView!
@IBOutlet var mapImageView: UIImageView!
override func viewDidLoad() {
var xScale = scrollView.frame.size.width / mapImageView.image?.size.width
var yScale = scrollView.frame.size.height / mapImageView.image?.size.height
var xCord = 3090
var yCord = 1280
scrollView.zoomScale = 3
scrollView.contentOffset = CGPointMake((x * xScale) - (scrollView.bounds.size.width / 2), (y * yScale) - (scrollView.bounds.size.height / 2))
}
我还希望国家/地区可见,因此我使用公式根据国家/地区的大小计算 zoomScale。出于测试目的,我设置了 scrollView.zoomScale = 3
。我打算放大的国家是阿富汗。但请记住,scrollView.zoomScale
会根据用户选择的国家而改变。
这是 map我在用。阿富汗以黄色突出显示。
只是为了澄清,scrollView 包含一个 imageView,其中包含我在上面提供的链接的 map 图像。
另外为了澄清,代码必须对任何坐标(来自原始图像文件)和通过公式计算的 scrollView.zoomScale
都是通用的(上面不是在代码中,而是在书面上)。
我最后的问题是如何使用我从原始图像文件(特别是 map 图像)收集的坐标,并将我的 scrollViews 可见部分定位在我收集的坐标上。
最佳答案
我想通了这个问题。我的理论是,在我设置内容偏移量之前,内容大小没有足够的时间生成。无论如何,我将内容偏移代码添加到 viewDidApear 方法中,然后将 zoomScale 设置添加到 viewDidLoad 中。此外,我将 scrollView.contentMode
更改为 UIViewContentMode.Redraw
并使用 setContentOffset
添加了一些动画。它适用于任何 zoomScale 值。这是我的代码...
@IBOutlet var scrollView: UIScrollView!
@IBOutlet var mapImageView: UIImageView!
override func viewDidLoad() {
scrollView.zoomScale = 5
}
override func viewDidAppear(animated: Bool) {
let xScale = scrollView.contentSize.width / (mapImageView.image?.size.width)!
let yScale = scrollView.contentSize.height / (mapImageView.image?.size.height)!
let xCord:CGFloat = 3090
let yCord:CGFloat = 1280
scrollView.setContentOffset(CGPointMake((xCord * xScale) - (scrollView.bounds.width / 2), (yCord * yScale) - scrollView.bounds.height / 2), animated: true)
scrollView.delegate = self
scrollView.contentMode = UIViewContentMode.Redraw
}
关于ios - 在 Swift 中的 ScrollView 中放大原始图像的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36683868/