Это xy вопрос: вы неправильно определили проблему.Представление изображения, которое вы добавляете в код, всегда имеет одинаковый размер на всех устройствах.Проблема заключается в представлении other , которое вы добавляете через раскадровку: , что изменяет размер на разных устройствах.И причина в том, что это то, что вы сказали, с вашими настройками авторазмера, которые выглядят так (я взял это непосредственно из проекта, который вы опубликовали для меня, чтобы посмотреть):
Я докажу это в два этапа.Во-первых, давайте поговорим только о представлении изображения, добавленном в код.Вот мой научный тестовый код (он написан на Swift, но я уверен, что вы можете его прочитать):
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
for i in stride(from: 0, to: 500, by: 100) {
let v = UIView(frame:CGRect(
x: CGFloat(i), y: 20, width: 10, height: 50))
v.backgroundColor = .black
self.view.addSubview(v)
}
let im = UIImage(named:"bullwinkle2.jpg")!
let iv = UIImageView(frame:CGRect(
x: 0, y: 50, width: im.size.width, height: im.size.height))
iv.image = im
self.view.addSubview(iv)
}
}
Вы видите, что я делаю?Сначала я строю своего рода «линейку» из черных подпредставлений, расположенных на расстоянии 100 пикселей друг от друга.Затем я создаю вид изображения и добавляю его, указывая ширину и высоту изображения.
Вот как это выглядит на симуляторе iPhone 5s:
Вот как это выглядит на симуляторе iPhone X:
Как видите, они оба показывают изображение одинакового размера:ширина изображения точно соответствует третьей отметке на обоих устройствах (ширина изображения должна быть ровно 200 пикселей).
Хорошо, перейдем ко второму этапу.Теперь я добавлю изображение в раскадровку, используя ваши параметры автоматического изменения размера с пружинами внутри, как по горизонтали, так и по вертикали:
Теперь я будуснова запустите тот же код на симуляторе iPhone 8:
Эти два изображения имеют одинаковый размер, потому что я разработал интерфейс в раскадровке, когдаразмер экрана был рассчитан на iPhone 8.
Хорошо, но теперь давайте снова запустим симулятор iPhone 5s:
Ага!Изображение раскадровки меньше из-за настроек авторазмера.Итак, вы видите, дело не в том, что изображение кода выходит слишком большим;Дело в том, что иногда изображение раскадровки получается слишком маленьким.
Последнее замечание: ваша конечная цель - создать представление изображения в коде того же размера, что и представление изображения из раскадровки.Но причина , что не всегда работает, в том, что вы поместили этот код в viewDidLoad
, что слишком рано.Вы не узнаете размер изображения раскадровки, пока не произойдет автоматическое изменение размера, что означает, что должен быть вызван viewDidLayoutSubviews
.Это происходит позже , чем viewDidLoad
.