我有一个室内地图应用程序。我有一个代表地图的.png。某些引脚需要在某些兴趣点(楼梯,电梯,商店等)上以编程方式放置在地图上。
让我们说在iPhone 5上,我添加了一个UIView作为我的UIImageView的子视图
CGPointMake(100,y:100)
它表示(放置)UIImageView中的一些楼梯。问题是,例如,当我在iPad上运行应用程序时,UIImageView更大,UIView不在楼梯上。我必须为UIView修改我的x,y。
我试图根据
进行一些计算以确定UIView的newX和newYUIScreen.mainScreen().bounds.size.width
和
UIScreen.mainScreen().bounds.size.height
但我无法将UIView放在每个设备的同一位置。
是否有第三方库可以解决我的问题?或者确定newX和newY的等式?
谢谢,
德拉戈什
答案 0 :(得分:0)
有两种方法可以解决这个问题:1)手动2)约束。
1)在交换机中手动设置CGPoint
您可以使用以下开关根据屏幕尺寸将CGPoint设置为准确值:
if UIDevice().userInterfaceIdiom == .Phone {
switch UIScreen.mainScreen().nativeBounds.height {
case 960:
// Set CGPoint for 4
case 1136:
// Set CGPoint for 5
case 1334:
// Set CGPoint for 6
case 2208:
// Set CGPoint for 6Plus
default:
break
}
}
优点:它快速而简单。缺点:它不会扩展(双关语)苹果可能发布的任何新的潜在屏幕尺寸。这样做并不是苹果公司希望开发人员创建接口的方式,这让我想到了......
2)使用约束来动态计算位置
我不确定您的视图是如何设置的,因此我无法确切地告诉您要使用哪些约束。但是,您可以使用前导,尾随,顶部,底部,centerX和centerY的混合来获得完美的位置。
您可以在故事板中添加约束(在我看来更容易)或在Swift中添加如下:
let pinView = UIView()
pinView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(pinView)
let horizontalConstraint = NSLayoutConstraint(item: pinView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
view.addConstraint(horizontalConstraint)
let leadingConstraint = NSLayoutConstraint(item: pinView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.LeadingMargin, multiplier: 1, constant: 0)
view.addConstraint(leadingConstraint)
关于约束的好处是:1)这就是Apple的意图2)它可以扩展3)手动计算的次数较少。
有关约束的更多信息,我会给这些读一读:
答案 1 :(得分:0)
我已经找到了一种方法,可以达到90%的准确率。 我使用百分比来计算x和y坐标。
因此,如果一个引脚的x为10%且y为15%,我就像这样计算x和y:
x = xPercentage / 100 * pinSuperView.frame.size.width
y = yPercentage / 100 * pinSuperView.frame.size.height
结果在iphone 5,iphone 6s和ipad 2上的结果相似。现在它只是讨论了针脚的宽度和高度,这将使它出现在单独的设备上并不完全在同一个地方,但还不错。
对我来说,我使用屏幕宽度来确定引脚的大小:
let width = UIScreen.mainScreen().bounds.size.width / 20
它会根据您使用的设备而改变。
同样,所有设备的准确度大约在90%-94%之间,但在我看来它还不错。
找出针脚的百分比是尝试和错误程序,或者知道超视图的宽度和高度,并执行类似于超级视图的操作,如果您想要钉住,获取坐标并根据超视宽度和高度。
如何获得您可以在此处找到的分界点:{C}目标C中的How to get a CGPoint from a tapped location?,但在swift中重写并不困难。