#swift #uiscrollview #constraints #interface-builder #nslayoutconstraint
#swift #uiscrollview #ограничения #конструктор интерфейса #nslayoutconstraint
Вопрос:
У меня есть два пользовательских представления в моем проекте, которые необходимо увеличить в точно такой же пропорции. Поэтому я решил использовать UIScrollView для этого, и он идеально подходит.
Я решил разработать очень простой класс, унаследованный от UIScrollView, и внутри него я инициализировал всю структуру представлений. Таким образом, я избегаю любых шагов построения в файле NIB, и мой класс можно использовать, просто добавив одно представление. Но я столкнулся с проблемой уже на этапе добавления contentView.
Вот мой класс:
final class PlayerContentView: UIScrollView {
fileprivate var contentView: UIView!
override func awakeFromNib() {
super.awakeFromNib()
self.backgroundColor = .clear
setupScrollProperties()
setupContentView()
}
private func setupScrollProperties()
{
self.translatesAutoresizingMaskIntoConstraints = false
self.minimumZoomScale = 1.0
self.maximumZoomScale = 2.0
self.contentSize = frame.size
self.delegate = self
}
private func setupContentView()
{
contentView = UIView(frame: self.frame)
contentView.backgroundColor = .red
self.addSubview(contentView)
CommonSwiftUtility.setSideConstraints(superview: self, view: contentView)
CommonSwiftUtility.setSizeConstraints(superview: self, view: contentView)
}
func requireToFail(_ gestureRecognizer: UIPanGestureRecognizer) {
self.panGestureRecognizer.require(toFail: gestureRecognizer)
} }
И вот методы для добавления ограничений:
static func setSideConstraints(superview: UIView, view: UIView) {
let topConstraint: NSLayoutConstraint = NSLayoutConstraint(item: view,
attribute: .top,
relatedBy: .equal,
toItem: superview,
attribute: .top,
multiplier: 1.0, constant: 0.0)
let bottomConstraint: NSLayoutConstraint = NSLayoutConstraint(item: view,
attribute: .bottom,
relatedBy: .equal,
toItem: superview,
attribute: .bottom,
multiplier: 1.0, constant: 0.0)
let leadingConstraint: NSLayoutConstraint = NSLayoutConstraint(item: view,
attribute: .leading,
relatedBy: .equal,
toItem: superview,
attribute: .leading,
multiplier: 1.0, constant: 0.0)
let trailingConstraint: NSLayoutConstraint = NSLayoutConstraint(item: view,
attribute: .trailing,
relatedBy: .equal,
toItem: superview,
attribute: .trailing,
multiplier: 1.0, constant: 0.0)
superview.addConstraint(topConstraint)
superview.addConstraint(bottomConstraint)
superview.addConstraint(leadingConstraint)
superview.addConstraint(trailingConstraint)
}
static func setSizeConstraints(superview: UIView, view: UIView)
{
let wConstraint: NSLayoutConstraint = NSLayoutConstraint(item: view,
attribute: .width,
relatedBy: .equal,
toItem: superview,
attribute: .width,
multiplier: 1.0, constant: 0.0)
let hConstraint: NSLayoutConstraint = NSLayoutConstraint(item: view,
attribute: .height,
relatedBy: .equal,
toItem: superview,
attribute: .height,
multiplier: 1.0, constant: 0.0)
superview.addConstraint(wConstraint)
superview.addConstraint(hConstraint)
}
Как вы можете видеть, я покрасил свой contentView в красный цвет, чтобы определить его на экране. После показа моего PlayerContentView я получаю это:
PlayerContentView растянут на весь экран, поэтому я ожидаю, что contentView будет полноразмерным, но, очевидно, это не так. Не мог бы кто-нибудь, пожалуйста, направить меня к решению этой проблемы? Заранее спасибо!
Ответ №1:
Можете ли вы установить
contentView.translatesAutoresizingMaskIntoConstraints = false
Комментарии:
1. Здравствуйте и спасибо за ваш ответ! Как вы можете видеть в
setupScrollProperties()
методе, я сделал это, но это ничего не изменило 🙁2. вы устанавливаете его для себя, а не для contentView
3. Вы на 100% правы, сэр! Ваше решение помогло, большое вам спасибо! Но одно замечание: мне нужно установить для каждого отдельного подвида
translatesAutoresizingMaskIntoConstraints
значениеfalse
, чтобы применить ограничения.4. Да, вы должны обновить это свойство до false, чтобы установить ограничения