2017-02-01 18 views
0

Я создал подкласс 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 все равно будет работать в рамках рамки родителя?

Извините, если это был ответ один или несколько раз раньше. Я на самом деле не уверен, что я ищу, или правильный вопрос, который нужно задать, только после дня траления. Спасибо

+0

Так что я боролся с этим в течение 2 дней, а затем зафиксировал его в течение 5 минут после публикации. Arg. Для справки, у меня есть часть тестового кода, который я оставил там, вызывающий translatesAutoresizingMaskIntoConstraints = false на главном представлении. – kric

+0

Код выглядит хорошо для меня. Но вы ничего не писали о том, как выставляется экземпляр TestButton. Похоже, что образ * должен * быть полным размером кнопки. Последняя мысль - вы отключаете маску авторезиста для кнопки? Вы можете добавить ** self..translatesAutoresizingMaskIntoConstraints = false ** непосредственно внутри init (coder :). – dfd

+0

@kric Рассмотрите возможность публикации и принятия собственного ответа, если вы нашли решение самостоятельно. – hybridcattt

ответ

0

Поведение представления TestButton будет зависеть от того, как оно ограничено в пределах его супервизора.

В NSLayoutConstraint с обеих участвующих атрибуты (или якоря) являются равноправными «партнеры»: только с этими четырьмя ограничениями у вас есть, ImageView будет принимать полный кадр из его родителей (TestButton), но в то же время TestButton будет чтобы быть достаточно большим для полноразмерного изображения.
Вы можете применить другие ограничения к представлению TestButton для предотвращения последнего.

Чтобы понять, почему стандартные представления ведут себя так, посмотрите на intrinsicContentSize (docs). Он реализуется стандартными элементами управления и сообщает системе автоматического макета, насколько большой должен быть вид, чисто основанный на его содержимом (например, UIButton или UISwitch являются такими же размерами, как это, например). UIImageView's intrinsicContentSize - размер его изображения, поэтому он расширяется полноразмерным, если ничего не мешает ему.

+0

Это покрывает его. еще раз спасибо – kric

 Смежные вопросы

  • Нет связанных вопросов^_^