В настоящее время я работаю над поддержкой 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)
}
}
Предполагается, что она будет выглядеть как
Но на самом деле это выглядит как