2016-03-07 1 views
0

Я пытаюсь нарисовать поверх изображения в 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 Im, конечно, пытаясь покрасить его на основе данных с внешнего устройства. Любые предложения/пример кода наиболее ценятся!

+0

Где вы звоните 'drawLayer()'? Переместить его в 'viewDidLayoutSubviews()' или 'layoutSubviews()', если он находится в подклассе UIView? – beyowulf

+0

Это не подкласс UIView, пока еще нет. И вызов setNeedsDisplay() заставляет просмотр перерисовываться. – Davidgs

+0

Вызов setNeedsDisplay обозначает слой, который нужно перерисовать (т. Е. Вы можете вызвать setNeedsDisplay три раза подряд, и он будет только перерисовываться один раз, когда пиксели будут нажаты на экран). Вы должны переместить свой код в 'viewDidLayoutSubviews()', как я и предложил, поскольку он вызывается после того, как механизм автоматического макета делает проход, поэтому последний раз 'viewDidLayoutSubviews()' называется 'Thermo.frame' будет правильным. – beyowulf

ответ

1

CALayer и его подклассы вкл. CAShapeLayer имеет свойство

var contentsScale: CGFloat 

От класса справки:

Для слоев создавать и управлять самостоятельно, вы должны установить значение этого свойства самостоятельно на основании разрешения экрана и содержание вы обеспечение. Core Animation использует значение, которое вы указываете в качестве метки, чтобы определить, как визуализировать ваш контент.

Так что вам нужно сделать, это установить масштаб на слое и вы получите масштаб устройства от UIDevice класса

circleLayer.scale = UIScreen.mainScreen().scale