Пользовательский Xib с определенными рамочными ограничениями изменяется во время выполнения - PullRequest
0 голосов
/ 06 декабря 2018

Я потратил несколько часов на поиски в Google и в отладчике, и я не могу понять, почему мое родительское представление в этом xib изменяется во время выполнения.

Я создал простой Xib:

enter image description here

В контейнере я установил ограничения ширины и высоты (я пытался установить ограничения в верхнем родительском элементе, но я не могу это сделать):

enter image description here

Во время выполнения я загружаю Xib программно и добавляю его в представление.Однако после того, как я добавлю его в представление и установлю позицию, рамка родительского элемента станет меньше, а позиция будет неправильной.

Здесь я явно установил x на 16, а y на 400. Однако когда я смотрю на него в инструменте отладки инспектора, я получаю результаты, отличные от желаемых, потому что изменился родительский фрейм и контейнерв результате неправильная позиция.Я повернул инспектор в сторону, чтобы вы могли видеть родительский элемент (синим цветом) и дочерний контейнер (белым цветом), а также то, как родительский элемент меньше дочернего:

enter image description here

Подробности для родителя (корневое представление xib «Виджет размера элемента данных») следующие.Обратите внимание, что высота теперь 32 вместо 76:

enter image description here

Ниже приведены подробности для дочернего элемента верхнего уровня (контейнера):

enter image description here

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

Я попытался выключить и включить translatesAutoResizingMaskIntoConstraints и некоторые другие вещи, но я не могу получить родительский размер точно такого же размера, как у контейнера.

Есть ли у вас какие-либо предложенияпочему корень Widget Detail Detail Size не будет соответствовать размеру контейнера и изменяется во время выполнения?

Update

Для справки приведен код, гдеЯ добавляю виджет:

    let sizer: ItemDetailSizeWidget = .fromNib() 
    sizer.x = 16
    sizer.y = 400
    contentView.addSubview(sizer)

У меня есть расширения UIView, которые устанавливают x и y следующим образом:

var x: CGFloat {
    set { self.frame = CGRect(x: newValue,
                              y: self.y,
                              width: self.width,
                              height: self.height)
        }
    get { return self.frame.origin.x }
}

var y: CGFloat {
    set { self.frame = CGRect(x: self.x,
                              y: newValue,
                              width: self.width,
                              height: self.height)
        }
    get { return self.frame.origin.y }
}

А вот расширение fromNib

class func fromNib<T: UIView>() -> T {
    return Bundle.main.loadNibNamed(String(describing: T.self), owner: nil, options: nil)![0] as! T
}

1 Ответ

0 голосов
/ 06 декабря 2018
  • Xcode всегда использует маску авторазмера для представления верхнего уровня в xib.Вы можете видеть, что ваш первый снимок экрана: на нем показан элемент управления авторазмером.

  • В вашем представлении верхнего уровня autoresizingMask установлена ​​гибкая ширина и высота.

  • Вы не установили никаких ограничений ширины или высоты между представлением верхнего уровня и подпредставлением «Контейнер».

У вас также есть этот код:

contentView.addSubview(sizer)

Я подозреваю (поскольку вы упоминаете contentView), что вы добавляете sizer в иерархию представлений ячейки табличного представления или ячейки представления коллекции.Когда ячейка создается впервые, она может еще не достигнуть окончательного размера.Представление коллекции (или представление таблицы) может изменить размер ячейки после того, как вы вернете ее из collectionView:cellForRowAtIndexPath:.

Поскольку ваше представление sizer имеет значение translatesAutoresizingMaskIntoConstraints, установленное в значение true, когда оно загружается из пера, и так как егоautoresizingMask равно [.flexibleWidth, .flexibleHeight], это означает, что оно будет увеличиваться или уменьшаться при увеличении или уменьшении его суперпредставления.

Чтобы исправить, попробуйте выполнить следующие действия:

  1. Изменитеавтоматически изменяя размер маски:

    autoresizing mask

  2. Ограничьте ширину «Виджета детализации размера элемента», чтобы она равнялась ширине «Контейнера»и ограничьте также высоту:

    constraints

...