Почему я не могу программно изменить передний край UIScrollView?

#ios #swift #xcode #uiscrollview #uikit

#iOS #swift #xcode #uiscrollview #uikit

Вопрос:

Я довольно новичок в разработке приложений для iOS. Я пытаюсь создать приложение для iOS, которое будет иметь вид горизонтальной прокрутки с метками, добавленными в качестве вложенных представлений, которые демонстрируют поведение привязки. Я использую UIKit и автоматические макеты (Swift 5, Xcode 12.01) для программного построения пользовательского интерфейса. У меня есть три метки, которые нужно добавить в вид прокрутки: одна расположена по центру, одна смещена на 500 пт от центра прокрутки (справа), а одна находится на -500 от центра (слева)

Когда я пытаюсь установить конечную привязку scrollview, ссылающуюся на метку справа, у меня нет проблем. Однако, когда я пытаюсь установить передний край, ссылающийся на метку слева (передний край), я сталкиваюсь с ошибкой: [LayoutConstraints] Невозможно одновременно удовлетворять ограничениям.

Я что-то упускаю? Я прилагаю свой код ниже:

 // Create scroll view on top of bottom view
func createScrollView() -> UIScrollView {
    
    let myScrollView = UIScrollView()
    myScrollView.isScrollEnabled = true
    myScrollView.backgroundColor = .red
    myScrollView.showsHorizontalScrollIndicator = true
    view.addSubview(myScrollView)
    // Constraints
    myScrollView.translatesAutoresizingMaskIntoConstraints = false
    myScrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
    myScrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    myScrollView.bottomAnchor.constraint(equalTo: bottomView.firstBaselineAnchor).isActive = true
    myScrollView.heightAnchor.constraint(equalToConstant: 50).isActive = true
    
    // Add some elements to the view
    let label1 = UILabel()
    let label2 = UILabel()
    let label3 = UILabel()
    label1.text = "EV 0."
    label1.font = .systemFont(ofSize: 20)
    label1.translatesAutoresizingMaskIntoConstraints = false
    label2.text = "ISO"
    label2.font = .systemFont(ofSize: 20)
    label2.translatesAutoresizingMaskIntoConstraints = false
    label3.text = "SNAP"
    label3.font = .systemFont(ofSize: 20)
    label3.translatesAutoresizingMaskIntoConstraints = false
    // Add labels to scroll view
    myScrollView.addSubview(label1)
    myScrollView.addSubview(label2)
    myScrollView.addSubview(label3)
    // Add constraint
    label1.centerYAnchor.constraint(equalTo: myScrollView.centerYAnchor).isActive = true
    label2.centerYAnchor.constraint(equalTo: myScrollView.centerYAnchor).isActive = true
    label3.centerYAnchor.constraint(equalTo: myScrollView.centerYAnchor).isActive = true
    label1.centerXAnchor.constraint(equalTo: myScrollView.centerXAnchor, constant: -300).isActive = true
    label2.centerXAnchor.constraint(equalTo: myScrollView.centerXAnchor, constant: 300).isActive = true
    label3.centerXAnchor.constraint(equalTo: myScrollView.centerXAnchor, constant: 0).isActive = true
    
    
    
    // Add last constraint in the scroll view
    myScrollView.leadingAnchor.constraint(equalTo: label1.leadingAnchor, constant: -500).isActive = true
    myScrollView.trailingAnchor.constraint(equalTo: label2.trailingAnchor, constant: 500).isActive = true
    return myScrollView
  

Большое спасибо за вашу помощь!!!

Комментарии:

1. Не совсем понятно, что вы пытаетесь сделать… Вы хотите добавить вид прокрутки шириной view в 3 метки, расположенные на расстоянии 300 пунктов друг от друга, и начать с центральной метки, центрированной по горизонтали в виде прокрутки?

2. У вас противоречивые ограничения. Вы пытаетесь установить label1 равным -300 от центра ScrollView, но также устанавливаете передний край ScrollView равным -500 от переднего края label1 и 0 от переднего края self.view.

3. @clawesome: по сути, я пытаюсь переопределить первый набор ограничений (относительный self.view), чтобы динамически добавлять метки к виду прокрутки, а затем настраивать его размер. Есть ли причина, по которой это работает справа? В принципе, я думал, что это должна быть та же процедура, но с отрицательными смещениями слева. Я ошибаюсь?

4. @DonMag: я хотел бы начать с просмотра прокрутки шириной view , а затем добавить метки, начиная с центра. Как я уже писал, моя логика работает справа, но я никогда не смогу прокручивать вид прокрутки влево больше, чем view.leadingAnchor

5. Можете ли вы дать обзор того, как вы хотите, чтобы метки и вид прокрутки были выложены?