Рамка UIView перезаписывается случайным образом
У меня проблема с тем, как UIViews
настроены.
ситуация
У меня есть представление, к которому я добавлю некоторые подробные виды. Эти подробные виды расположены в последовательном порядке, так же, как строки UITableView
являются. Это на самом деле довольно хорошее сравнение. Разница в том, что в этом представлении мы не прокручиваем вверх и вниз, а в стороны.
Из этих подробных видов на экране всегда только один. Когда я добавляю этот первый экран, я также загружаю следующий (справа) и отрисовываю его за пределами экрана (снова справа). Когда пользователь нажимает кнопку, перед предыдущим представлением мы видим небольшую анимацию. Последний видимый вид выдвигается слева, а справа появляется второй вид. В этот момент я сохраняю ссылку на теперь левый и загружаю новый правый, если он есть. Я создал протокол делает любой другой объект источником данных для того, что я называю SlidableDetailViewController
(SDVC
).
В настоящее время я настраиваю подробные представления во время источника данных didSet
, Во время этой настройки он генерирует эти три кадра (опять же, левый, центральный и правый).
вопрос
Когда вид загружается и впервые появляется на экране, рамка центрального вида не такая, какой должна быть, а намного меньше. Второй подробный вид будет отображаться правильно. Когда я вернусь к первому, кадр также будет обновлен и исправлен.
Когда я отлаживаю в нем, кадры рассчитываются и устанавливаются правильно. Когда я врываюсь viewWillAppear(_:)
даже кадр вида - это то, что я ожидаю. Когда я делаю то же самое в viewDidAppear(_:)
оно уже уменьшилось до такого странного размера, которого никто не хотел. Я ничего не делаю в тех; Я просто использовал их для отладки кода.
Кто-нибудь видит, что я здесь делаю не так?
Я уверен, что это просто глупая ошибка с моей стороны, но я не могу понять это прямо сейчас.
Обновление примеров кода
Расчет кадров:
private func calculateFrames() {
// Get the size for our views from the dataSource.
let detailViewSize: CGSize
if let theDataSource = dataSource {
detailViewSize = theDataSource.detailViewSize()
} else {
// Just use a few default values.
detailViewSize = CGSizeMake(320, 185)
}
// Calculate the frame for on screen display.
let detailFrameX = (view.frame.width - detailViewSize.width) / 2
let detailFrameY = (view.frame.height / 2 - detailViewSize.height / 2)
centerFrame = CGRectMake(detailFrameX, detailFrameY, detailViewSize.width, detailViewSize.height)
// The other two frames are basically just offsets of the original centerFrame.
leftFrame = centerFrame?.offsetBy(dx: (detailViewOffset * -1), dy: 0.0)
rightFrame = centerFrame?.offsetBy(dx: detailViewOffset, dy: 0.0)
}
Загрузка следующего вида (загрузка предыдущего вида работает примерно так же):
func showNextDetailView() {
// 1. If we're at the last item, we can't advance.
if selectedIndex == detailsCount() - 1 {
return
}
// 2. Check if there is a view on the left spot
if leftView != nil {
// 2.1. … if so, remove it from superView.
leftView?.removeFromSuperview()
}
UIView.animateWithDuration(animationDuration, delay: 0.0, options: .CurveEaseInOut, animations: { () -> Void in
// 3. Set the frame of the view at selectedIndex to leftFrame.
self.centerView?.frame = self.leftFrame!
// 4. Set the frame of the view at selectedIndex + 1 to center frame.
self.rightView?.frame = self.centerFrame!
}) { (finished) -> Void in
print("animation to next detail view finished")
}
// 5. Increase the selectedIndex
selectedIndex++
// Store the new positions for quick reference.
if let theDataSource = dataSource {
if let newLeftView = theDataSource.detailViewAtIndex(selectedIndex - 1) {
leftView = newLeftView
}
if let newCenterView = theDataSource.detailViewAtIndex(selectedIndex) {
centerView = newCenterView
}
// 6. Check if we have more views left
if detailsCount() - 1 > selectedIndex {
// 6.1 … and if so, add a new one to the right.
rightView = theDataSource.detailViewAtIndex(selectedIndex + 1)
rightView?.frame = rightFrame!
contentView.addSubview(rightView!)
} else {
rightView = nil
}
}
}
Спасибо!
1 ответ
Я смог исправить это с помощью обычного UIPageViewController
как предложено Робом Майоффом.