iOS屏幕坐标和缩放

问题描述:

我试图在CALayer中绘制图像的顶部,并且在绘图显示在不同大小的显示器上的位置出现问题。iOS屏幕坐标和缩放

func drawLayer(){ 
    let circleLayer = CAShapeLayer() 
    let radius: CGFloat = 30 
    let x = Thermo.frame.origin.x 
    let y = Thermo.frame.origin.y 
    let XX = Thermo.frame.width 
    let YY = Thermo.frame.height 
    print("X: \(x) Y: \(y) Width: \(XX) Height: \(YY)") 
    circleLayer.path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 2.0 * radius, height: 2.0 * radius) , cornerRadius: radius).CGPath 
    circleLayer.fillColor = UIColor.redColor().CGColor 
    circleLayer.shadowOffset = CGSizeMake(0, 3) 
    circleLayer.shadowRadius = 5.0 
    circleLayer.shadowColor = UIColor.blackColor().CGColor 
    circleLayer.shadowOpacity = 0.8 
    circleLayer.frame = CGRectMake(0, 410, 0, 192); 
    self.Thermo.layer.addSublayer(circleLayer) 
    circleLayer.setNeedsDisplay() 
} 

在正确的地方画一个圆圈,对于iPhone 6s。但是,当封装的UIImageView组件缩放到较小的设备时,显然不会。我添加了print()以查看图像的大小和位置是什么......以及在X上运行它的每台设备上都完全相同:192.0 Y:8.0宽度:216.0高度:584.0但显然它已被缩放受到AuoLayout经理的限制。

所以,我的问题是,如果我不能使用封闭视图的大小和位置,我怎么才能找出适当的广播和位置的不同屏幕尺寸,因为这似乎永远不会改变?

这是我开始的图像,在UIImageView中,并试图画出来。 Base Image我当然试图根据来自外部设备的数据着色。任何建议/示例代码最赞赏!

+0

获得设备的规模你在哪里调用'drawLayer()'?如果它位于UIView的子类中,将它移动到'viewDidLayoutSubviews()'或'layoutSubviews()? – beyowulf

+0

它不是UIView的子类,现在还没有。并调用setNeedsDisplay()会导致视图重新绘制。 – Davidgs

+0

调用setNeedsDisplay会将图层标记为需要重绘的图层(即,您可以连续调用setNeedsDisplay三次,并且只有当像素被推入屏幕时才会重绘一次)。您应该将代码移动到'viewDidLayoutSubviews()',正如我所建议的那样,因为在自动布局引擎进行传递后调用该代码,因此最后一次调用'viewDidLayoutSubviews()'的时候调用'Thermo.frame'将是正确的。 – beyowulf

CALayer及其子类包括CAShapeLayer有一个属性

var contentsScale: CGFloat 

从类参考:

为您创建和管理自己的图层,您必须设置该属性的值,你自己根据屏幕的分辨率和你的内容提供。核心动画使用您指定的值作为提示来确定如何呈现您的内容。

所以你需要做的是设置图层的规模和你的UIDevice类

circleLayer.scale = UIScreen.mainScreen().scale