2016-08-01 50 views
1

我有一个Indoor Mapping应用程序。我有一个代表地图的.png。有些引脚需要在某些兴趣点(楼梯,电梯,商店等)以编程方式放置在地图上。Swift - 在所有设备的相同位置向UIImageView添加子视图

比方说,在iPhone 5,我在点

CGPointMake(100,y:100) 

添加一个UIView作为一个子视图我的UIImageView,它表明(被放完了)一些楼梯在UIImageView的。问题是,当我在iPad上运行应用程序时,例如,UIImageView较大,UIView不在楼梯上。我必须修改我的x,y为UIView。

我曾试图弥补根据

UIScreen.mainScreen().bounds.size.width 

UIScreen.mainScreen().bounds.size.height 

一些计算来确定的UIView的下一页末和newY但我不能设法地方的UIView在每个设备都有相同的点。

是否有第三方库可以解决我的问题?还是一个方程来确定newX和newY?

谢谢

德拉戈什

+0

请提供您的代码和屏幕截图的问题。 – DJ1

+0

您可能想要使用约束布局强制UIImageView的大小,和/或更改UIImageView的内容模式? – Larme

+0

iPhone5:http://picpaste.com/iphone5-JmugDSJq.png iPhone6:http://picpaste.com/Iphone6-wT6L7Zes.png –

回答

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%左右,但在我看来这足够好。

找出引脚的百分比是一个试验和错误的过程,或知道超视图的宽度和高度,并做一些事情,如在你想要你钉住的超级视图上,获取坐标并根据超视图宽度计算百分比和高度。

如何获得点击点,你可以在这里找到:How to get a CGPoint from a tapped location?在目标C中,但它不是很难在swift中重写。

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 
    } 
} 

利用这一点:它是快捷方便。缺点:它不会缩放(双关语)到Apple可能发布的任何新的潜在屏幕尺寸。这样做是不是真的苹果打算如何开发者创建的接口,这使我想到...

2)使用约束来动态计算的位置

我不知道您的看法究竟如何是设置,所以我不能确切地告诉你使用什么限制。但是,您可以使用领先,尾随,顶部,底部,centerX和centerY的组合来获得完美位置。

您可以在故事板添加约束(在我看来更容易),或在斯威夫特这样的:

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)这是苹果打算如何在这2)它扩展3 )手动计算的工作量较少。

有关约束的详细信息,我想给这些读:

+0

我试过两种组合。我已经把iphone5的一些针脚放在了我的视图上,并且有一定的限制,我尝试根据屏幕的宽度和高度以编程方式修改我的约束,这样在iphone 5上会是相同的,并且在iphone 6中会添加一个值到约束的常数值。但是我没有设法在两台设备上放置在同一个地方。 –

相关问题