Установка button.frame.origin не меняет местоположение в scrollView в swift - PullRequest
0 голосов
/ 20 февраля 2020

Я добавляю несколько кнопок программно в вертикальном ScrollView в Swift. Для каждой кнопки я рассчитываю комнату в одном ряду. Если места достаточно, кнопка добавляется после предыдущей кнопки, в противном случае она будет добавлена ​​в новый ряд. Я пытаюсь установить расположение каждой кнопки, используя

topButtons[j].frame.origin.x = currentOriginX
topButtons[j].frame.origin.y = currentOriginY

, где currentOriginX и currentOriginY меняются в каждой итерации. Однако кнопки по-прежнему отображаются в верхнем левом углу представления прокрутки и, таким образом, перекрывают друг друга. Как мне решить эту проблему? (Также я хотел оставить ширину кнопки такой же, как и ее текст, поэтому я не установил ширину кнопки.)

Мой код прикреплен ниже.

    @IBOutlet weak var topScrollView: UIScrollView!
    var topButtons = [UIButtons()]
    func displayTopItems() {

        let scrollViewWidth = topScrollView.frame.size.width
        let buttonHeight = CGFloat(40)
        var currentOriginX = topScrollView.frame.origin.x
        var currentOriginY = topScrollView.frame.origin.y
        self.topScrollView.automaticallyAdjustsScrollIndicatorInsets = false
        self.topScrollView.isScrollEnabled = true
        self.topScrollView.isUserInteractionEnabled = true
        self.topScrollView.translatesAutoresizingMaskIntoConstraints = false

        for j in 0..<self.itemsClass.toBuyItems.count {

            topButtons.append(UIButton(type: UIButton.ButtonType.system))
            topButtons[j].setTitle(self.itemsClass.toBuyItems[j], for: UIControl.State.normal)

            let buttonWidth = topButtons[j].frame.size.width
            if j > 0 {
                let lastButtonLeft = topButtons[j-1].frame.origin.x
                let lastButtonWidth = topButtons[j-1].frame.size.width
                let sameRow = lastButtonLeft + lastButtonWidth + buttonWidth + 50 < scrollViewWidth
                if sameRow {
                    currentOriginX += lastButtonWidth + 30
                }
                else {
                    currentOriginX = 0
                    currentOriginY += buttonSize.height + 20
                }
            }
//            self.topScrollView.contentOffset.x = currentOriginX
//            self.topScrollView.contentOffset.y = currentOriginY
            topButtons[j].frame.origin.x = currentOriginX
            topButtons[j].frame.origin.y = currentOriginY
            topButtons[j].setTitleColor(UIColor.white, for: UIControl.State.normal)
            topButtons[j].backgroundColor = UIColor.black
            topButtons[j].translatesAutoresizingMaskIntoConstraints = false
            topButtons[j].heightAnchor.constraint(equalToConstant: buttonSize.height).isActive = true
            topButtons[j].layer.borderColor = UIColor.red.cgColor
            topButtons[j].layer.cornerRadius = 10.0
            topButtons[j].addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
            topButtons[j].tag = j
            self.topScrollView.addSubview(topButtons[j])
        }
    }

1 Ответ

0 голосов
/ 21 февраля 2020

Расположение кнопок необходимо задать, указав ограничения после их добавления в представление.

    topButtons[j].setTitleColor(UIColor.white, for: UIControl.State.normal)
    topButtons[j].backgroundColor = UIColor.black
    topButtons[j].translatesAutoresizingMaskIntoConstraints = false
    topButtons[j].heightAnchor.constraint(equalToConstant: buttonSize.height).isActive = true
    topButtons[j].layer.borderColor = UIColor.red.cgColor
    topButtons[j].layer.cornerRadius = 10.0
    topButtons[j].addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
    topButtons[j].tag = j
    self.topScrollView.addSubview(topButtons[j])
    // do this after adding buttons to view
    topButtons[j].topAnchor.constraint(equalTo: topScrollView.topAnchor, constant: currentOriginY).isActive = true
    topButtons[j].leadingAnchor.constraint(equalTo: topScrollView.leadingAnchor, constant: currentOriginX).isActive = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...