Но это нарушает размеры и ограничения imageView.
Да, потому что вы забыли начать с того, что сказали
override func layoutSubviews() {
super.layoutSubviews() // important
Так как автоматическое расположение происходит в layoutSubviews
, если вы не позвоните super
, вы не сможете его запустить.