Ios UIToolbar没有';我不适合屏幕

Ios UIToolbar没有';我不适合屏幕,ios,swift,rotation,autolayout,uitoolbar,Ios,Swift,Rotation,Autolayout,Uitoolbar,我制作了一个自定义键盘工具栏: 为此,我创建了一个工具栏 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 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)

我将视图添加到UITextField的键盘上

一切正常,但当我旋转设备时:

(clusterView UIToolbar可以正确调整大小,但不能调整包含的两个工具栏…)

我试过了

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    methodWhichGeneratesToolbar() 
}
但这是一样的,我能试着解决这个问题吗


这里有一个建议,说明如何使用可视化格式语言(VFL)进行编程自动布局。您需要了解VFL字符串语法(它们将外部视图固定到主视图的顶部和侧面,将两个子视图固定在内部和彼此之间,并将其高度设置为44)

我没有安装AdMob,所以我使用了一个常规的UIView而不是banner视图,但希望它能以类似的方式调整大小-这段代码在测试应用程序的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来执行这些约束)

你试过使用编程自动布局吗?不,老实说,我从来没有用代码研究过自动布局…我在实现它的同时更新了代码,效果非常好。。。我将学习VFL。。。非常感谢你!
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)
    }