Swift - 为所有设备在相同位置添加子视图到UIImageView

时间:2016-08-01 12:41:01

标签: ios iphone swift ipad uiimageview

我有一个室内地图应用程序。我有一个代表地图的.png。某些引脚需要在某些兴趣点(楼梯,电梯,商店等)上以编程方式放置在地图上。

让我们说在iPhone 5上,我添加了一个UIView作为我的UIImageView的子视图

CGPointMake(100,y:100)

它表示(放置)UIImageView中的一些楼梯。问题是,例如,当我在iPad上运行应用程序时,UIImageView更大,UIView不在楼梯上。我必须为UIView修改我的x,y。

我试图根据

进行一些计算以确定UIView的newX和newY
UIScreen.mainScreen().bounds.size.width

UIScreen.mainScreen().bounds.size.height

但我无法将UIView放在每个设备的同一位置。

是否有第三方库可以解决我的问题?或者确定newX和newY的等式?

谢谢,

德拉戈什

2 个答案:

答案 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中重写并不困难。