【问题标题】:Change UILabel.frame when orientation changes using viewWillTransition使用 viewWillTransition 更改方向时更改 UILabel.frame
【发布时间】:2019-05-15 18:05:44
【问题描述】:

我以编程方式在 UIInputViewController 的 viewDidLoad() 中创建了一组按钮。当方向从横向变为纵向时,我正在尝试更改这些按钮的大小,反之亦然。

我正在尝试通过使用来做到这一点

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

但是当我通过相同的代码在 viewDidLoad() 中创建我的按钮时,只更改了 UIlabel.frame 以适应新的高度和宽度,视图不会更新。我是否必须先删除按钮并从头开始加载它们,还是有其他方法可以做到这一点?

下面是函数的完整代码。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    let width = screensize.width
    var height = CGFloat(141)
    let sizey = screensize.height

    switch sizey {
    case 1366:
        height = CGFloat(383-15)
    case 1112:
        height = CGFloat(320-15)
    case 812:
        height = CGFloat(141-15)
    case 1024:
        height = CGFloat(320-15)
    case 736:
        height = CGFloat(226-15)
    case 667:
        height = CGFloat(216-15)
    case 568:
        height = CGFloat(216-15)
    case 768:
        height = CGFloat(420-15)
    default:
        height = CGFloat(141-15)
    }

    connection.frame = CGRect(x: 0,         y: 0, width: width/2,     height: 15)
    serialNum.frame = CGRect( x: width/2,   y: 0, width: width/2,     height:15)

    plus.frame = CGRect(x:0,              y: 15,            width: width/5,height: height/4)
    minus.frame = CGRect(x:0,             y: height/4+15,   width: width/5,height: height/4)
    left.frame = CGRect(x:0,              y: height/2+15,   width: width/5,height: height/4)
    nextKeyboardButton.frame = CGRect(x:0,y: 3*height/4+15, width: width/5,height: height/4)

    num1.frame = CGRect(x:width/5,    y: 15,            width: width/5,height: height/4)
    num4.frame = CGRect(x:width/5,    y: height/4+15,   width: width/5,height: height/4)
    num7.frame = CGRect(x:width/5,    y: height/2+15,   width: width/5,height: height/4)
    comma.frame = CGRect(x:width/5,   y: 3*height/4+15, width: width/5,height: height/4)

    num2.frame = CGRect(x:width*2/5,y: 15,            width: width/5,height: height/4)
    num5.frame = CGRect(x:width*2/5,y: height/4+15,   width: width/5,height: height/4)
    num8.frame = CGRect(x:width*2/5,y: height/2+15,   width: width/5,height: height/4)
    num0.frame = CGRect(x:width*2/5,y: 3*height/4+15, width: width/5,height: height/4)


    num3.frame = CGRect(x:width*3/5,y: 15,            width: width/5,height: height/4)
    num6.frame = CGRect(x:width*3/5,y: height/4+15,   width: width/5,height: height/4)
    num9.frame = CGRect(x:width*3/5,y: height/2+15,   width: width/5,height: height/4)
    period.frame = CGRect(x:width*3/5,y: 3*height/4+15, width: width/5,height: height/4)

    back.frame = CGRect(x:width*4/5,      y: 15,            width: width/5,  height: height/4)
    spaceBar.frame = CGRect(x: width*4/5, y: height/4+15,   width: width/5,  height: height/4)
    right.frame =
        CGRect(x: width*4/5,    y: height/2+15,   width: width/5,  height: height/4)
    returnKey.frame = CGRect(x:width*4/5, y: height*3/4+15, width: width/5,  height: height/4)


    self.view.addSubview(spaceBar)
    self.view.addSubview(num1)
    self.view.addSubview(num2)
    self.view.addSubview(num3)
    self.view.addSubview(num4)
    self.view.addSubview(num5)
    self.view.addSubview(num6)
    self.view.addSubview(num7)
    self.view.addSubview(num8)
    self.view.addSubview(num9)
    self.view.addSubview(num0)
    self.view.addSubview(plus)
    self.view.addSubview(minus)
    self.view.addSubview(back)
    self.view.addSubview(left)
    self.view.addSubview(right)
    self.view.addSubview(period)
    self.view.addSubview(comma)
    self.view.addSubview(nextKeyboardButton)
    self.view.addSubview(returnKey)

【问题讨论】:

  • 你为什么不使用自动布局
  • @Sh_Khan 在这种情况下如何使用自动布局?

标签: ios swift xcode uibutton


【解决方案1】:

您需要使用在“viewWillTransition”方法中获得的“size”参数来设置新的“width”和“sizey”属性,而不是“screensize”。

【讨论】:

    【解决方案2】:

    如果您已经在viewDidLoad 中添加了按钮,则不应在方向更改时调用addSubview。更新框架就足够了。

    【讨论】:

      【解决方案3】:

      由于您已经在UIInputViewControllerviewDidLoad() 中添加了这组按钮,因此您无需在viewWillTransition to size 方法中使用addSubview

      即使在旋转设备后,您仍在使用旧屏幕尺寸。

      改变

      let width = screensize.width
      let sizey = screensize.height
      

      let width = UIScreen.main.bounds.width
      let sizey = UIScreen.main.bounds.height
      

      或者

      let width = size.width
      let sizey = size.height
      

      【讨论】:

      • 我没有使用全屏尺寸。此代码用于自定义键盘扩展,我使用的是键盘矩形的大小以及宽度和高度。我正在根据屏幕的总大小调整高度(您可以在我的 switch case 语句中看到这一点。)
      • @MWaz 在 vi​​ewWillTransition to size 方法中,您使用了 screenSize 变量。并根据此尺寸更改了所有标签、按钮框架。但是您没有在任何地方更改此 screenSize。如果纵向是 (100,150),那么横向也是 (100,150)。希望你理解
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多