2017-01-10 8 views
0

Итак, в моем TableViewCell у меня есть imageView, у которого есть 0 байт-ограничение для трейлинг-листа и ведущего супервизора. Верхние ограничения 8 и нижнего ограничения 30 для супервизора. А потом добавить аспект ограничение в ImageView в соответствии с изображением с этим кодом:Мой ломающий лог-лог не имеет никакого смысла, может кто-нибудь помочь мне понять?

override var image: UIImage? { 
     didSet { 
      if let image = image { 
       let aspect = image.size.width/image.size.height 
       aspectConstraint = NSLayoutConstraint(item: self, 
                 attribute: NSLayoutAttribute.width, 
                 relatedBy: NSLayoutRelation.equal, 
                 toItem: self, 
                 attribute: NSLayoutAttribute.height, 
                 multiplier: aspect, 
                 constant: 0.0) 
      } 
     } 
    } 

    internal var aspectConstraint : NSLayoutConstraint? { 
     didSet { 
      if oldValue != nil { 
       self.removeConstraint(oldValue!) 
      } 
      if aspectConstraint != nil { 
       self.addConstraint(aspectConstraint!) 
      } 
     } 
    } 

как мой код нарушения каких-либо ограничений? они не имеют ничего общего с Афоризм

2017-01-10 21: 15: 18.502301 Gymkhana [4538: 65958] [LayoutConstraints] Невозможно одновременно удовлетворяют ограничениям. Вероятно, по крайней мере один из ограничений в следующем списке - это тот, который вы не хотите. Попробуйте : (1) посмотрите на каждое ограничение и попытайтесь выяснить, какие вы не ожидаете; (2) найти код, который добавил нежелательное ограничение или ограничения и исправить его. (

"<NSLayoutConstraint:0x78698d60 UILabel:0x7869e890'Identical twins play a mi...'.top == UITableViewCellContentView:0x7869e500.topMargin (active)>", 
"<NSLayoutConstraint:0x7869c930 V:[UILabel:0x79ba65a0'1h']-(8)-[Gymkhana.ThumbnailImageView:0x7869c340] (active)>", 
"<NSLayoutConstraint:0x786a9ef0 H:[Gymkhana.ThumbnailImageView:0x7869c340]-(0)-| (active, names: '|':UITableViewCellContentView:0x7869e500)>", 
"<NSLayoutConstraint:0x78689700 H:|-(0)-[Gymkhana.ThumbnailImageView:0x7869c340] (active, names: '|':UITableViewCellContentView:0x7869e500)>", 
"<NSLayoutConstraint:0x7869a1b0 V:[Gymkhana.ThumbnailImageView:0x7869c340]-(30)-| (active, names: '|':UITableViewCellContentView:0x7869e500)>", 
"<NSLayoutConstraint:0x7869ca10 V:[UILabel:0x7869e890'Identical twins play a mi...']-(8)-[UILabel:0x79ba65a0'1h'] (active)>", 
"<NSLayoutConstraint:0x798fb620 Gymkhana.ThumbnailImageView:0x7869c340.width == Gymkhana.ThumbnailImageView:0x7869c340.height (active)>", 
"<NSLayoutConstraint:0x79b85b80 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7869e500.height == 329 (active)>", 
"<NSLayoutConstraint:0x79b82b80 'UIView-Encapsulated-Layout-Width' UITableViewCellContentView:0x7869e500.width == 320 (active)>") 

будет пытаться восстановить разбив ограничение

<NSLayoutConstraint:0x798fb620 
Gymkhana.ThumbnailImageView:0x7869c340.width==Gymkhana.ThumbnailImageView:0x7869c340.height (active)> 
+1

Можете ли вы включить строки для ограничений и ограничения, которые это сломало? –

+1

Попробуйте удалить нижнее ограничение. Предоставляет ли он вам предупреждение? – Yannick

+0

@yannick Удаление нижнего ограничения делает мою ячейку просмотра таблицы сжатой, а просмотр изображения невозможен – samitarmum

ответ

2

Ограничения можно рассматривать правила, которые использует AutoLayout при попытке вычислить 4 параметров вида: х, у (значение координаты точки верхний левый угол), ширину и высоту. Вы помещаете 5 ограничений на изображение, поэтому, за исключением особых случаев, между ними будут некоторые конфликты.

Первые 4 ограничения, о которых вы уже говорили, достаточно информации для AutoLayout, чтобы рассчитать все 4 параметра для вашего imageView, о котором я упоминал. Затем возникает ограничение соотношения сторон, и это почти наверняка противоречит другим ограничениям, если только предыдущие уже не привели к точному такому же аспекту, который вы задали в ограничении.

Есть 2 способа вы могли бы решить эту проблему:

  1. Если изображение вы хотите установить в ImageView уже имеет соотношение сторон вы хотите: снять ограничение с соотношением сторон полностью. Вместо этого используйте свойство imageView's contentMode.

  2. Если вам действительно нужно определенное соотношение сторон к вашему изображению, тогда вам нужно переосмыслить свои другие 4 ограничения, так как очевидно, что некоторые из них не точно представляют, как вы хотите, чтобы ваш ImageView был позиционирован и изменен , Например: возможно, вам не нужны ведущие и конечные ограничения, и вы просто хотели, чтобы ImageView имел одинаковое расстояние от левой и правой стороны своего супервизора? Затем удалите конечные и ведущие ограничения и вместо этого добавьте ограничение «по горизонтали».

+0

добавьте центр по горизонтали и удалите ограничение тропа и свинца, чтобы связать его изображение с размером больше, чем содержащая его ячейка, сделав его обрезанным слева и правая сторона. У вас есть другое решение? – samitarmum

+1

Как и в пункте 1: полностью устранить ограничение на аспект. Установите 'contentMode' ImageView' 'UIViewContentModeScaleAspectFit' – johnyu

+0

. Причина, по которой я добавляю ограничение на ограничение в первую очередь, это проблема: http: // stackoverflow.com/questions/26041820/auto-layout-get-uiimageview-height-to-calculate-cell-height-правильно. – samitarmum