Метка Swift Scroll View перемещается после переключения вида вкладки

У меня есть панель вкладок, а в одном из представлений есть прокрутка. Я добавил метку к этому представлению прокрутки, но после загрузки она оказалась не в том месте. После того, как вы перейдете на другую вкладку и вернетесь, она сразу же окажется в правильном положении.

Вот код:

    scrollViewFunc()
    scrollView.addSubview(dateLbl)
    dateLbl.center = CGPoint(x: self.scrollView.center.x, y: self.scrollView.center.y + 100)

    func scrollViewFunc() {

    scrollView.translatesAutoresizingMaskIntoConstraints = false

    scrollView.contentSize.height = 800
    scrollView.backgroundColor = UIColor.brown
    self.view.addSubview(scrollView)

    //x,w,t,b
    scrollView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    scrollView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

}

Я поместил его в viewDidLoad(), чтобы настроить вид прокрутки, а также viewWillAppear, но при загрузке все еще возникает проблема, связанная с тем, что он находится в неправильном месте.

Любой совет?


person Peter Dutton    schedule 11.01.2019    source источник


Ответы (1)


Вы назначаете фрейм своей метке до того, как у scrollView появится фрейм.

I.e dateLbl.center = CGPoint(x: self.scrollView.center.x, y: self.scrollView.center.y + 100)

Должен прийти после

    scrollView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    scrollView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

Кроме того, я бы не стал рассчитывать на то, что ограничения немедленно разрешат правильный фрейм, вы, вероятно, захотите также настроить dateLbl с ограничениями или установить фреймы в viewDidLayoutSubviews, когда вы знаете, что scrollView имеет правильный фрейм.

person user614273    schedule 11.01.2019
comment
Но моя главная проблема заключается в том, что он меняет свое положение, когда вы переключаетесь на вкладки, а затем возвращаетесь обратно. он не загружается в правильном месте в первый раз @ user614273 - person Peter Dutton; 11.01.2019
comment
он не загружается в правильном положении в первый раз - это вызвано порядком. То есть, когда вы назначаете CGPoint центру dateLbl, ваш scrollView еще не имеет правильного кадра, что означает, что self.scrollView.center.x и .y будут иметь неправильные значения. моя основная проблема заключается в том, что он меняет свое положение, когда вы переключаете представления вкладок, а затем возвращаетесь назад. Настройка кадров для ваших подпредставлений в -viewDidLayoutSubviews вместо -viewDidLoad гарантирует, что ваши обновления кадров будут выполняться при нажатии на эту вкладку. - person user614273; 11.01.2019
comment
Использование ограничений для метки, такой как dateLbl.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor).isActive = true, также должно решить вашу проблему, поскольку тогда вы отложите расчет фрейма меток до тех пор, пока у scrollView не будет фрейма (обрабатывается внутренне механизмом ограничений). - person user614273; 11.01.2019