У меня проблемы с пониманием этого. Ранее я мог делать такой проект, но теперь подобный подход не работает для меня.
Вот проблема:
У меня есть UIPageViewController, который имеет 4 storyViewControllers
.
Каждый storyViewControllers
имеет пользовательский containerView
. Я хочу добавить 'n' число UIViews
на containerView
. Я посылаю dataSource
или 'n' с контроллера представления. Однако я не могу правильно выложить подпредставления в представлении контейнера.
По сути, я хочу знать, когда отправлять информацию об источнике данных из контроллера представления. Очевидно, я хотел бы отправить его после добавления пользовательского представления контейнера.
Я использую viewDidLayoutSubviews
. Это заставляет это работать. Однако я не думаю, что это правильный путь. Теперь каждый раз, когда контроллер представления выкладывает подпредставления, будет вызываться мой делегат.
Я пытался сделать это в viewDidLoad()
, но это тоже не работает.
Это работает. Но просто не кажется правильным. Als
Мой storyViewController
код
override func viewDidLoad() {
super.viewDidLoad()
segmentContainerView = ATCStorySegmentsView()
view.addSubview(segmentContainerView)
configureSegmentContainerView()
segmentContainerView.translatesAutoresizingMaskIntoConstraints = false
}
override func viewDidLayoutSubviews() {
segmentContainerView.delegate = self
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.segmentContainerView.startAnimation() // I am also animating these views that are laid on the containerView. Doing them here starts the animation randomly whenever I scroll through the UIPageController
}
}
В containerView
:
var delegate: ATCSegmentDataSource? {
didSet {
addSegments()
}
}
private func addSegments() {
let numberOfSegment = delegate?.numberOfSegmentsToShow()
guard let segmentQuantity = numberOfSegment else { return }
layoutIfNeeded()
setNeedsLayout()
for i in 0..<segmentQuantity {
let segment = Segment()
addSubview(segment.bottomSegment)
addSubview(segment.topSegment)
configureSegmentFrame(index: i, segmentView: segment)
segmentsArray.append(segment)
}
}
private func configureSegmentFrame(index: Int, segmentView: Segment) {
let numberOfSegment = delegate?.numberOfSegmentsToShow()
guard let segmentQuantity = numberOfSegment else { return }
let widthOfSegment : CGFloat = (self.frame.width - (padding * CGFloat(segmentQuantity - 1))) / CGFloat(segmentQuantity)
let i = CGFloat(index)
let segmentFrame = CGRect(x: i * (widthOfSegment + padding), y: 0, width: widthOfSegment, height: self.frame.height)
segmentView.bottomSegment.frame = segmentFrame
segmentView.topSegment.frame = segmentFrame
segmentView.topSegment.frame.size.width = 0
}
Это работает так, как должно. Но когда я прокручиваю UIPageViewController, анимация не всегда начинается с самого начала. Так как он опирается на выкладку подпредставлений. Иногда, если я медленно прокручиваю страницу контроллера, тогда подпредставления выкладываются снова, и анимация начинается с начала. В других случаях, когда представления уже загружены, анимация начинается с того места, где я не учел.
Вопрос Я хочу знать, каков наилучший способ отправки источника данных из контроллера представления в containerView? Этот источник данных - это то, что необходимо для генерации количества представлений, добавляемых в containerView.
Это результат, который я получаю, если отправляю источник данных из viewDidLayoutSubviews
. Ранее сегодня я задал еще один вопрос, в котором перечислены другие методы, которые я использовал для отправки источника данных. Взгляните также на это: Невозможно выложить подпредставления в пользовательском UIView в Swift