Я пытаюсь нарисовать поверх изображения в 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, и пытаюсь нарисовать. Im, конечно, пытаясь покрасить его на основе данных с внешнего устройства. Любые предложения/пример кода наиболее ценятся!
Где вы звоните 'drawLayer()'? Переместить его в 'viewDidLayoutSubviews()' или 'layoutSubviews()', если он находится в подклассе UIView? – beyowulf
Это не подкласс UIView, пока еще нет. И вызов setNeedsDisplay() заставляет просмотр перерисовываться. – Davidgs
Вызов setNeedsDisplay обозначает слой, который нужно перерисовать (т. Е. Вы можете вызвать setNeedsDisplay три раза подряд, и он будет только перерисовываться один раз, когда пиксели будут нажаты на экран). Вы должны переместить свой код в 'viewDidLayoutSubviews()', как я и предложил, поскольку он вызывается после того, как механизм автоматического макета делает проход, поэтому последний раз 'viewDidLayoutSubviews()' называется 'Thermo.frame' будет правильным. – beyowulf