Рамка 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 как предложено Робом Майоффом.

Другие вопросы по тегам