Представления не масштабируются правильно, если устройство не установлено в раскадровке (просмотр как: iphone 5s / 8 / etc) - PullRequest
0 голосов
/ 27 ноября 2018

Проще всего описать скриншотами («вид как», о котором я говорю, находится в правом нижнем углу каждого изображения):

Симулятор: iPhone 8, вид раскадровки как: iPhone 8 - работает отлично

enter image description here

Симулятор: iPhone 8 плюс, вид раскадровки как: iPhone 8 - не работает

enter image description here

Симулятор: iPhone 8 plus, вид раскадровки как: iPhone 8 plus - отлично работает

enter image description here

Пример кода, которыйдолжен работать правильно, и работает, когда раскадровка настроена на эту модель телефона, но не иначе:

gradientLayer.frame = CGRect(x: 0, y:0, width: self.view.bounds.width, height: self.view.bounds.height)
gradientLayer.colors = [Colors().bgRed.cgColor, Colors().mediumBlue.cgColor, Colors().highlitMedBlue.cgColor]
gradientLayer.startPoint = CGPoint(x: 0.1, y: 0.1)
gradientLayer.endPoint = CGPoint(x: 1, y: 1)
self.view.layer.addSublayer(gradientLayer)

Другие примеры сбоев - это когда я использую view.convert (viewX, to: viewY),и он работает / дает сбой при тех же обстоятельствах, что и на рисунках выше.

Что здесь происходит?Это просто симулятор, который не так?Я неправильно использую autolayout?Будет ли это работать, если я попробую на самом деле на телефонах, а не на симуляторе?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы устанавливаете рамки неправильно.Ширина и высота должны быть получены из self.view.frame

Попробуйте использовать

gradientLayer.frame = CGRect(x: 0, y:0, width: self.view.frame.width, height: self.view.frame.height)

Если вы хотите использовать self.view.bounds,

Тогда попробуйте

gradientLayer.frame = self.view.bounds

дайте мне знать, если это работает.

0 голосов
/ 27 ноября 2018

Вы можете попытаться поместить линию кадра внутрь viewDidLayoutSubviews

override func viewDidLayoutSubviews() {
  super.viewDidLayoutSubviews() 
  gradientLayer.frame = self.view.bounds 
}

. Это прекрасно работает для симулятора с такими же настройками, что и для раскадровки, потому что размер его вида рассматривается для рендеринга до viewDidLayoutSubviewsпоставляется с правильным размером текущего симулятора / устройства

...