Подтвердить что ты не робот

Добавление ограничения в подвью делает фоновый цвет не отображен

Итак, я использую настраиваемую функцию для форматирования подсмотра, который я добавляю к UICollectionViewCell. Это из публичного проекта Брайана Воона: https://github.com/purelyswift/facebook_feed_dynamic_cell_content/blob/master/facebookfeed2/ViewController.swift.

func addConstraintsWithFormat(format: String, views: UIView...) {
   var viewsDictionary = [String: UIView]()
   for (index, view) in views.enumerate() {
      let key = "v\(index)"
      viewsDictionary[key] = view
      view.translatesAutoresizingMaskIntoConstraints = false
   }
   addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary))
}

Интересно, что в моем UICollectionView я добавляю SubView в одну ячейку и устанавливаю белый цвет фона. Фон является белым, когда я прокомментирую строку, которая устанавливает фон для подвью, и цвет фона не задается, когда я раскомментирую строку, задающую визуально отформатированные ограничения для subview.

Вот две линии, которые сжимают друг друга:

func chronicleOneClicked(sender: UIButton) {
   point1view.backgroundColor = UIColor.whiteColor()

   addSubview(point1view)
   //When the below is commented the background of point1view disappears   
   //addConstraintsWithFormat("|-50-[v0]-50-|", views: point1view)
}

когда я делаю print(subviews), я вижу, что UIView с белым цветом фона является самым высоким в стеке представления (верхняя часть стека). Когда я распечатываю subviews[subviews.count-1].backgroundColor, я получаю Optional(UIDeviceWhiteColorSpace 1 1), что и ожидаю. это странно, потому что цвет не отображается.

Я не уверен, как узнать, что происходит за кулисами, чтобы подтвердить, что в последнем случае фон вообще установлен.

Все это происходит в классе для UICollectionViewCell, который я использую как класс одной из моих UICollectionView Ячейков, которые можно просмотреть здесь целиком:

https://gist.github.com/ebbnormal/edb79a15dab4797946e0d1f6905c2dd0

Вот скриншот из обоих случаев, первый случай - это то, где строка addConstraintsWithFormat закомментирована, а второй случай - там, где она раскоментирована. Подвью под point1subview выделено белым фоном в первый случай.

введите описание изображения здесь

введите описание изображения здесь

Вот как я настраиваю представления. Все это происходит в классе, который переопределяет UICollectionViewCell

class myClass : UICollectionViewCell {
   var chronicle: BrowsableChronicle? {
      didSet{
         //etc.
         point1.addTarget(self, action: #selector(chronicleOneClicked(_:)), forControlEvents: UIControlEvents.TouchUpInside)
      }
   }

   override init(frame: CGRect) {
      super.init(frame: frame)
      setupViews()
   }

   let point1 : PointButtonView = {
      let pointView = PointButtonView(frame: CGRectMake(0, 0, 25, 25 ))
      return pointView
   }()
   //NOTE here is where I create the view, whose background doesn't display
   let point1view : UIView = {
      let pointView = UIView(frame: CGRectMake( 0, 0, 200,  270))
      pointView.backgroundColor = UIColor.whiteColor()
      let title = UILabel(frame: CGRectMake(0, 0, 200, 21))
      title.font = UIFont(name:"HelveticaNeue-Bold", size: 16.0)

      pointView.addSubview(title)
      let summary = UILabel(frame: CGRectMake(0, 0, 190, 260))
      summary.lineBreakMode = NSLineBreakMode.ByWordWrapping
      summary.numberOfLines = 4
      summary.font = UIFont(name:"HelveticaNeue", size: 12.5)
      pointView.addSubview(summary)

      let button = UIButton(frame: CGRectMake(0, 200, 190, 30))
      button.backgroundColor = UIColor(red:0.00, green:0.90, blue:0.93, alpha:1.0)
      pointView.addSubview(button)

      pointView.tag = 100

      return pointView
   }()

   //NOTE: here is where I add the subview to the UICollectionViewCell view
   func chronicleOneClicked(sender: UIButton){
      addSubview(point1view)
      addConstraintsWithFormat("H:|-20-[v0]-20-|", views: point1view)
      //TODO anytime i add a constraint here the background color leaves!
      print(subviews[subviews.count-1].backgroundColor) //Prints white
   }
}

ОБНОВЛЕНИЕ: Я думал, возможно, это было связано с этой проблемой:

Подменю UITableViewCell исчезает при выборе ячейки

Если выбрано UICollectionViewCell, и поэтому iOS автоматически устанавливает очистку backgroundColor. Проблема в том, что я реализовал это расширение класса UIView, чтобы увидеть, когда didSet вызывается в backgroundColor, и когда он установлен для очистки, я устанавливаю его в белый. Тем не менее, он вызывает только didSet на backgroundColor один раз, когда я сначала устанавливаю цвет представления. Вот код, который я использовал для переопределения класса UIView:

class NeverClearView: UIView {
   override var backgroundColor: UIColor? {
      didSet {
         print("background color is being set")
         if backgroundColor == UIColor.clearColor() {
            print("set to a clear color")
            backgroundColor = UIColor.whiteColor()
         }
      }
   }
}
4b9b3361

Ответ 1

Разница, которую вы видите, явно вызвана рамкой представления, результатом которой является нулевая ширина или нулевая высота.

Объясните, как работает система рисования.

Каждый вид имеет слой, который рисует свой цвет фона в своих границах, которые задаются рамкой представления. Затем набирается каждое подобие. Тем не менее, просмотры не ограничены рамкой, если вы не установите UIView.clipsToBounds в true.

То, что вы видите, означает, что представление контейнера имеет нулевой кадр (ширину или высоту), но его подпункты имеют правильный фрейм, поэтому они отображаются правильно.

Существует несколько причин, почему это может произойти, например:

  • Вы устанавливаете translatesAutoresizingMaskIntoConstraints в false в системный вид (например, представление содержимого UICollectionView).
  • У вас есть конфликт ограничений, в результате чего некоторые важные ограничения должны быть удалены (вы должны увидеть предупреждение).
  • Вам не хватает некоторых ограничений. В частности, я не вижу установки вертикальных ограничений.

Вы должны уметь отлаживать проблему, используя отладчик вида в Xcode. Просто откройте приложение, нажмите кнопку "Отладка" и напечатайте рекурсивное описание ячейки. Вы должны увидеть фрейм, который равен нулю.