Я создал подкласс UIControl под названием «TestButton» с меткой и представлением изображения. Этот объект создается с помощью фрейма, и в качестве части процесса инициализации я создаю элементы subview.AutoLayout в программном виде UIControl не работает
Эти «тестовые кнопки» создаются программно, я никогда не использую их в StoryBoard.
Фрагмент кода:
class TestButton: UIControl {
var iconImageView: UIImageView?
var labelView: UILabel?
required init(size: CGSize, icon: UIImage? text: String?) {
super.init(frame: CGRect(x: 0, y: 0, width: size.width, height: size.height))
if ((icon != nil) && (text != nil)) {
self.iconImageView = UIImageView()
self.iconImageView?.translatesAutoresizingMaskIntoConstraints = false
self.iconImageView?.contentMode = .center
self.iconImageView?.image = icon
self.iconImageView?.backgroundColor = UIColor.yellow // test: show bounds
self.labelView = UILabel()
self.labelView?.translatesAutoresizingMaskIntoConstraints = false
self.labelView?.text = "Test"
self.labelView?.backgroundColor = UIColor.blue
self.addSubview(self.iconImageView!)
//self.addSubview(self.labelView!)
// Setup constraints on created subview(s)
self.iconImageView?.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
self.iconImageView?.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
self.iconImageView?.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
self.iconImageView?.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
}
}
override func layoutSubviews() {
super.layoutSubviews()
print("iconframe: \(self.iconImageView!.frame)")
}
В приведенном выше примере, я удалил ярлык из смеси. Я только пытаюсь заставить ограничения ImageView работать и эффективно изменять размер изображения в представлении. Это не работает, изображение отображается в полном размере, и ограничения, по-видимому, игнорируются. Я попытался переместить код ограничений в updateConstraints и вызвать это - все, похоже, работает, но опять же ограничения не применяются.
layoutSubviews вызывает вызов, когда вы ожидаете, что это будет, но рамка imageView не изменена. В окне вывода нет сообщений, он просто молча работает.
Мой вопрос: я каким-то образом отключил autoLayout, указав кадр родителя? Я бы ожидал, что autoLayout все равно будет работать в рамках рамки родителя?
Извините, если это был ответ один или несколько раз раньше. Я на самом деле не уверен, что я ищу, или правильный вопрос, который нужно задать, только после дня траления. Спасибо
Так что я боролся с этим в течение 2 дней, а затем зафиксировал его в течение 5 минут после публикации. Arg. Для справки, у меня есть часть тестового кода, который я оставил там, вызывающий translatesAutoresizingMaskIntoConstraints = false на главном представлении. – kric
Код выглядит хорошо для меня. Но вы ничего не писали о том, как выставляется экземпляр TestButton. Похоже, что образ * должен * быть полным размером кнопки. Последняя мысль - вы отключаете маску авторезиста для кнопки? Вы можете добавить ** self..translatesAutoresizingMaskIntoConstraints = false ** непосредственно внутри init (coder :). – dfd
@kric Рассмотрите возможность публикации и принятия собственного ответа, если вы нашли решение самостоятельно. – hybridcattt