Я потратил несколько часов на поиски в Google и в отладчике, и я не могу понять, почему мое родительское представление в этом xib изменяется во время выполнения.
Я создал простой Xib:
В контейнере я установил ограничения ширины и высоты (я пытался установить ограничения в верхнем родительском элементе, но я не могу это сделать):
Во время выполнения я загружаю Xib программно и добавляю его в представление.Однако после того, как я добавлю его в представление и установлю позицию, рамка родительского элемента станет меньше, а позиция будет неправильной.
Здесь я явно установил x на 16, а y на 400. Однако когда я смотрю на него в инструменте отладки инспектора, я получаю результаты, отличные от желаемых, потому что изменился родительский фрейм и контейнерв результате неправильная позиция.Я повернул инспектор в сторону, чтобы вы могли видеть родительский элемент (синим цветом) и дочерний контейнер (белым цветом), а также то, как родительский элемент меньше дочернего:
Подробности для родителя (корневое представление xib «Виджет размера элемента данных») следующие.Обратите внимание, что высота теперь 32 вместо 76:
Ниже приведены подробности для дочернего элемента верхнего уровня (контейнера):
Таким образом, ограничения, которые я установил для контейнера, соблюдаются, но размер родительского элемента изменяется (я предположил, что, поскольку я не мог установить ограничения, он использовал бы кадр, который я установил).
Я попытался выключить и включить 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
}