Настройте макет в зависимости от размера кадра при включении устройства - PullRequest
0 голосов
/ 18 июня 2020

В настоящее время я работаю над поддержкой iPad в моем приложении. Я пытаюсь изменить размер шестигранных кнопок после поворота устройства (или iPad). Проблема в том, что размер кнопок зависит от размера представления, в котором они находятся. На практике это означает, что ширина и высота каждой кнопки равны hexagonsView.frame.size / 3.5. Хотя кнопки достигают нужного размера, это происходит только при внезапном замедленном движении после поворота устройства. Заголовки кнопок также становятся либо слишком большими, либо слишком маленькими, чем должны быть. И как ни странно, когда я вызываю buttonsSetup() в viewDidLoad(), вообще ничего не происходит.

Итак, мой вопрос сводится к следующему: как изменить размер кнопок с плавной анимацией, исправить ошибку viewDidLoad() и также изменить размер заголовков кнопок?

Следующий код настраивает кнопки:

func buttonsSetup() {
    hexButtons.append(contentsOf: [centerHexBtn, upperHexBtn, lowerHexBtn, leftUpHexBtn, leftLowHexBtn, rightUpHexBtn, rightLowHexBtn])

    for hexButton in hexButtons {
        hexButton.translatesAutoresizingMaskIntoConstraints = false
        hexButton.setTitle("A", for: .normal)
        hexButton.setTitleColor(.black, for: .normal)
        if hexButton != centerHexBtn {
            hexButton.color = UIColor.init(named: "Gray")
        }
        hexButton.isEnabled = true
   }
}

Это код, который должен изменять размер кнопок после поворота устройства:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: nil, completion: {
        _ in
        self.buttonsSetup()
    })

    self.view.layoutIfNeeded()
    print("View will transition")
}

Следующий код создает кнопку в правильном порядке:

func hexButtonsSetup() {
    for button in hexButtons {
        for constraint in button.constraints {
            button.removeConstraint(constraint)
        }
        button.removeFromSuperview()
    }

    hexagonButtonConfiguration()

    print(hexagonsView.frame.size)

    width = hexagonsView.frame.width
    buttonWidth = hexagonsView.frame.width / 3.5
    buttonHeight = abs(tan(.pi / 3) * buttonWidth / 4 * 2) //actual height of button
    centerButtonsXPosition = width / 2 - buttonWidth / 2
    rightButtonsXPosition = centerButtonsXPosition + buttonWidth / 4 * 3

    distanceRightToCenterBtns = -(buttonWidth / 4) + ((tan(.pi / 3) * (padding / 2)))
    distanceLeftToCenterBtns = -distanceRightToCenterBtns

    hexagonsViewWidthPart1 = buttonWidth * 2 + buttonWidth / 2
    hexagonsViewWidthPart2 = ((tan(.pi / 3) * (padding / 2))) * 2

    let constraints = [

        centerHexBtn.centerXAnchor.constraint(equalTo: hexagonsView.centerXAnchor),
        centerHexBtn.centerYAnchor.constraint(equalTo: hexagonsView.centerYAnchor),

        upperHexBtn.centerXAnchor.constraint(equalTo: hexagonsView.centerXAnchor),
        upperHexBtn.bottomAnchor.constraint(equalTo: centerHexBtn.topAnchor, constant: buttonWidth - buttonHeight - padding),

        lowerHexBtn.centerXAnchor.constraint(equalTo: hexagonsView.centerXAnchor),
        lowerHexBtn.topAnchor.constraint(equalTo: centerHexBtn.bottomAnchor, constant: -(buttonWidth - buttonHeight) + padding),

        rightUpHexBtn.leftAnchor.constraint(equalTo: upperHexBtn.rightAnchor, constant: distanceRightToCenterBtns),
        rightUpHexBtn.topAnchor.constraint(equalTo: upperHexBtn.centerYAnchor, constant: -((buttonWidth - buttonHeight) / 2) + (padding / 2)),

        rightLowHexBtn.leftAnchor.constraint(equalTo: centerHexBtn.rightAnchor, constant: distanceRightToCenterBtns),
        rightLowHexBtn.topAnchor.constraint(equalTo: centerHexBtn.centerYAnchor, constant: -((buttonWidth - buttonHeight) / 2) + (padding / 2)),

        leftUpHexBtn.rightAnchor.constraint(equalTo: upperHexBtn.leftAnchor, constant: distanceLeftToCenterBtns),
        leftUpHexBtn.topAnchor.constraint(equalTo: upperHexBtn.centerYAnchor, constant: -((buttonWidth - buttonHeight) / 2) + (padding / 2)),

        leftLowHexBtn.rightAnchor.constraint(equalTo: centerHexBtn.leftAnchor, constant: distanceLeftToCenterBtns),
        leftLowHexBtn.topAnchor.constraint(equalTo: centerHexBtn.centerYAnchor, constant: -((buttonWidth - buttonHeight) / 2) + (padding / 2)),

    ]

    NSLayoutConstraint.activate(constraints)

    adjustButtonFontSize()
}

func hexagonButtonConfiguration() {

    for button in hexButtons {

        hexagonsView.addSubview(button)

        NSLayoutConstraint.activate([
            button.heightAnchor.constraint(equalTo: hexagonsView.widthAnchor, multiplier: 0.3, constant: 0),
            button.widthAnchor.constraint(equalTo: hexagonsView.widthAnchor, multiplier: 0.3, constant: 0),
        ])
    }
}

func adjustButtonFontSize() {

    for button in hexButtons {
        let width = button.frame.width

        button.titleLabel?.font = UIFont.systemFont(ofSize: width / 2.5, weight: .bold)
    }
}

Предполагается, что она будет выглядеть как

this

Но на самом деле это выглядит как

this

...