У меня есть UIViewController
с четырьмя UIButtons
(2 x 2) на нем, которые я написал в построителе интерфейса, который отлично работал. У меня будет бесплатная и поддерживаемая рекламой версия моего приложения, поэтому мне нужно переделать эту сцену для загрузки на основе того, является ли приложение платной или поддерживаемой рекламой версией. Исходя из этого, я пытаюсь использовать язык визуального форматирования, чтобы выложить представление. Я получаю неправильные значения для моих высот UIButton
, несмотря на их учет, когда я их вычисляю. Я не могу понять свою ошибку (или упущение?).Нежелательная высота кнопки вычисляется с использованием языка визуального форматирования
Вот скриншот моего интерфейса-строителя.
У меня нет ограничений на мои кнопки в интерфейсе строителя, но я уже IBOutlets
подключен к MyViewController
. MyViewController
находится в навигационном контроллере и имеет панель вкладок внизу.
Я создал метод, называемый layoutButtons
, который я вызываю в viewDidLoad
сразу после super.viewDidLoad()
. Вот оно:
func layoutButtons() {
// Configure layout constraints
// Remove interface builder constraints from storyboard
view.removeConstraints(view.constraints)
// create array to dump constraints into
var allConstraints = [NSLayoutConstraint]()
// determine screen size
let screenSize: CGRect = UIScreen.mainScreen().bounds
let navBarRect = navigationController!.navigationBar.frame
let navBarHeight = navBarRect.height
let tabBarRect = tabBarController!.tabBar.frame
let tabBarHeight: CGFloat = tabBarRect.height
// calculate button width based on screen size
// padding for left + middle + right = 8.0 + 8.0 + 8.0 = 24.0
let buttonWidth = (screenSize.width - 24.0)/2
/*
My buttons are extending under the top & bottom layout guides despite accounting
for them when I set the buttonHeight.
*/
// padding for top + middle + bottom = 8.0 + 8.0 + 8.0 = 24.0
let buttonHeight = (screenSize.height - topLayoutGuide.length - bottomLayoutGuide.length - 24.0)/2
// create dictionary of metrics
let metrics = ["buttonWidth": buttonWidth,
"buttonHeight": buttonHeight,
"navBarHeight": navBarHeight,
"tabBarHeight": tabBarHeight,
"bannerAdWidth": bannerAdWidth,
"bannerAdHeight": bannerAdHeight]
// create dictionary of views
var views: [String : AnyObject] = ["firstButton": firstButton,
"secondButton": secondButton,
"thirdButton": thirdButton,
"fourthButton": fourthButton,
"topLayoutGuide": topLayoutGuide,
"bottomLayoutGuide": bottomLayoutGuide]
let topRowHorizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat(
"H:|-[firstButton(buttonWidth)]-[secondButton(buttonWidth)]-|",
options: [.AlignAllCenterY],
metrics: metrics,
views: views)
allConstraints += topRowHorizontalConstraints
let bottomRowHorizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat(
"H:|-[thirdButton(buttonWidth)]-[fourthButton(buttonWidth)]-|",
options: [.AlignAllCenterY],
metrics: metrics,
views: views)
allConstraints += bottomRowHorizontalConstraints
let leftColumnVerticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat(
"V:|[topLayoutGuide]-[firstButton(buttonHeight)]-[thirdButton(buttonHeight)]-[bottomLayoutGuide]|",
options: [],
metrics: metrics,
views: views)
allConstraints += leftColumnVerticalConstraints
let rightColumnVerticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat(
"V:|[topLayoutGuide]-[secondButton(buttonHeight)]-[fourthButton(buttonHeight)]-[bottomLayoutGuide]|",
options: [],
metrics: metrics,
views: views)
allConstraints += rightColumnVerticalConstraints
NSLayoutConstraint.activateConstraints(allConstraints)
}
Я возился с моей buttonHeight
переменной, но каждая итерация я попробовал результаты в кнопках простирающийся под topLayoutGuide
и bottomLayoutGuide
. Вот как это выглядит во время исполнения:
Я приветствую любые предложения, где искать свою ошибку. Спасибо за чтение.
Выполнить свой метод из '' viewWillAppear' или viewDidAppear'. В 'viewDidLoad' реальный размер представления еще не рассчитан. Поскольку ваш расчет высоты зависит от высоты представления, его нужно вызывать в нужном месте. – Fogmeister
Кроме того, что вы на самом деле хотите, чтобы это выглядело? – Fogmeister
Я бы хотел, чтобы все 4 кнопки были нарисованы между навигационной панелью и вкладкой. – Adrian