2016-01-17 2 views
1

я сделал аа пользовательских клавиатуры на панели инструментов:UIToolbar не помещается на экране

enter image description here

Чтобы сделать это, я создал панель инструментов

let keyboardToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 44)) 

и вид для баннера

adToolbar = GADBannerView(frame: CGRectMake(0, 44, self.view.bounds.size.width, 44)) 

затем я сгруппировал их в другой UIToolbar (я тоже пытался UIView)

let clusterView = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 88)) 
clusterView.addSubview(adToolbar) 
clusterView.addSubview(keyboardToolbar) 

и я добавил вид на клавиатуру UITextField.

Все в порядке, но когда я поворачиваю устройство происходит следующим образом:

clusterView UIToolbar resize correctly but not the two contained bars... (clusterView UIToolbar размер правильно, но не два содержали бары ...)

Я попытался с

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    methodWhichGeneratesToolbar() 
} 

Но это то же самое, что я могу попытаться решить эту проблему?

P.S.: I've made an example project.

+0

Вы пробовали использовать автоматическую автонастройку? –

+0

Нет, честно говоря, я никогда не изучал автозапуск по коду ... –

ответ

2

Вот предложение о том, как сделать это с помощью программного autolayout визуального форматирования языка (VFL). Вам нужно взглянуть на the VFL docs, чтобы понять синтаксис строки VFL (они прикрепляют внешний вид к вершине и сторонам основного вида и прикрепляют два поднабора внутри и друг к другу и устанавливают их высоту до 44).

Я не установили AdMob, так что я использовал регулярные UIView вместо представления баннера, но, надеюсь, он должен изменить размер так же - этот код работает нормально на 9,2 симулятор в тестовом приложении

let keyboardToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 44)) 
keyboardToolbar.translatesAutoresizingMaskIntoConstraints = false //This is critical for all programmatic autolayout - if you forget it nothing will work 


let adToolbar = UIView(frame: CGRectMake(0, 44, self.view.bounds.size.width, 44)) 
adToolbar.translatesAutoresizingMaskIntoConstraints = false 


let clusterView = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 88)) 
clusterView.translatesAutoresizingMaskIntoConstraints = false 

//Map views to keys used in visual format language strings 
let views = ["keyboardToolbar":keyboardToolbar,"adToolbar":adToolbar,"clusterView":clusterView] 

//Map values to strings used in vfl strings 
let metrics = ["barHeight":44] 

//In named variables to make it clear what they are 
//Syntax is explained in link above 
let verticalConstraintsStr = "V:|[keyboardToolbar(barHeight)][adToolbar(barHeight)]|" 
let adHorizontalConstraintsStr = "|[adToolbar]|" 
let keyboardHorizontalConstraintsStr = "|[keyboardToolbar]|" 

let subViewConstraintStrs = [ 
    verticalConstraintsStr, 
    adHorizontalConstraintsStr, 
    keyboardHorizontalConstraintsStr 
] 


//Views must be added to subviews before adding constraints 
// if the superview is referenced using 
//the | symbol in the VFL strings 

clusterView.addSubview(keyboardToolbar) 
clusterView.addSubview(adToolbar) 

//Converts strings to constraints for subviews and add them 

for constraintStr in subViewConstraintStrs { 
    let allConstraints = NSLayoutConstraint.constraintsWithVisualFormat(constraintStr, options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: views) 
    clusterView.addConstraints(allConstraints) 

} 

let clusterVerticalConstraintsStr = "V:|[clusterView]" //Note no | at the end - no bottom pin 
let clusterHorizontalConstraintsStr = "|[clusterView]|" 

view.addSubview(clusterView) 

//Same process for the enclosing view 

for constraintStr in [clusterVerticalConstraintsStr,clusterHorizontalConstraintsStr] { 
     let allConstraints = NSLayoutConstraint.constraintsWithVisualFormat(constraintStr, options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: views) 
     view.addConstraints(allConstraints) 
    } 

VFL является мощным, но раздражающим для отладки и не может выполнять все типы ограничений (например, не выравнивание - для этого вам нужно использовать еще более подробный API).

+0

Я обновляю код, когда я его реализовал, и он отлично работает! ... Я буду изучать ВФЛ ... большое спасибо! –

Смежные вопросы