如何在父视图的框架更改时自动更新子视图?

时间:2016-07-28 13:04:35

标签: ios swift uiview keyboard ios-app-extension

我正在修改自定义键盘应用程序。我第一次尝试使用堆栈视图进行布局视图时,性能下降了4-6秒。所以,我正在使用自定义视图创建一个新的自定义键盘并调用layoutSubviews(),以便布局其视图。

现在,我已经制作了一个代表键盘的自定义视图。顺便说一句,我正在硬编码键盘大小的值。所以,这个只适用于iPhone 5和5s。 (我正在检查视图的帧宽。)

现在,我想让键盘的视图控制器在视图控制器绑定更新时更新自定义视图的帧!

  

如何将自定义视图设置为父级以填充父级宽度和高度,以便在视图控制器的绑定更改时更新自定义视图的边界/帧?

到目前为止,这是代码。

import UIKit

class KeyboardViewController: UIInputViewController {

    var keyboardView: KeyboardView?


    override func updateViewConstraints() {
        super.updateViewConstraints()

        // Add custom view sizing constraints here
    }

    override func viewDidLoad() {
        super.viewDidLoad()

       view.autoresizesSubviews = true

        keyboardView = KeyboardView(frame: view.frame)

        view.addSubview(keyboardView!)

    }




}

而且,这是自定义视图的代码。

import UIKit

class KeyboardView: UIView {

    // MARK:- Properties
    var row1ButtonLabels = ["Q","W","E","R","T","Y","U","I","O","P"]

    var row1Buttons = [UIButton]()
    var row2Buttons = [UIButton]()
    var row3Buttons = [UIButton]()
    var row4Buttons = [UIButton]()

    override init(frame: CGRect) {
        super.init(frame: frame)

        for i in 0..<10 {

            let button = UIButton(frame: CGRect(x: 0, y: 12, width: 26, height: 38))
            button.setTitle(row1ButtonLabels[i], forState: .Normal)

            button.addTarget(self, action: Selector("printCharacter"), forControlEvents: .TouchDown)



            button.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.45)
            button.layer.cornerRadius = 4.0

            row1Buttons.append(button)


            addSubview(button)
        }


    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        for i in 0..<10 {



            let button = UIButton(frame: CGRect(x: 0, y: 12, width: 26, height: 38))
            button.setTitle(row1ButtonLabels[i], forState: .Normal)

            button.addTarget(self, action: Selector("printCharacter"), forControlEvents: .TouchDown)



            button.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.45)
            button.layer.cornerRadius = 4.0

            row1Buttons.append(button)


            addSubview(button)
        }
    }

    override func layoutSubviews() {

        print("LayoutSubviews")

        if frame.width == 320 {


            var buttonFrame = CGRect(x: 0, y: 12, width: 26, height: 38)

            for (index, button) in row1Buttons.enumerate() {

                // If button is first button, then add leadingSpace
                // Else it is ( leadingSpace + (buttonWidth + interButtonSpace) * index )
                let xPosition = index == 0 ? 3 : (3 + 26 * index + 6 * index)

                buttonFrame.origin.x = CGFloat(xPosition)

                button.frame = buttonFrame

            }

        } else if frame.width == 568 {

            var buttonFrame = CGRect(x: 0, y: 6, width: 47, height: 32)

            for (index, button) in row1Buttons.enumerate() {

                // If button is first button, then add leadingSpace
                // Else it is ( leadingSpace + (buttonWidth + interButtonSpace) * index )
                let xPosition = index == 0 ? 26 : (26 + 47 * index + 5 * index)


                buttonFrame.origin.x = CGFloat(xPosition)

                print("Frame: \(buttonFrame)")

                button.frame = buttonFrame

            }

        }
    }

    // Ignore this for now, only for testing if keyboard is working or not. And, it worked.
    func printCharacter(){        


        for button in row1Buttons {

               button.setTitle( button.titleLabel?.text?.lowercaseString , forState: .Normal)

        }
    }

}

注意:我实现了init(编码器)仅用于在故事板中测试它。所以,请忽略它。

此外,我的自定义键盘现在运行正常,仅在iPhone 6s上延迟运行2-3秒。但是,对于拥有背景图像也是如此。

回过头来看,我知道只要自定义视图的框架发生变化,就会调用layoutSubviews。我希望自定义视图采用键盘视图控制器的完整帧大小,因为键盘应采用完整的帧大小,这是可以预期的。

请求:

  

如何将自定义视图设置为父级以填充父级宽度和高度,以便在视图控制器的绑定更改时更新自定义视图的边界/帧?

我没有使用自动布局,虽然它是公平的。所以,它只是以编程方式完成。

我也正在跟踪它并正在研究UIView的文档。我联系了两个属性:autoresizingMaskautoresizesSubviews,目前正在检查他们是否可以帮助我。我选择自己布局子视图,因为在自动布局的情况下,性能命中率非常高。但这只是我个人的偏好。

同样,对于有兴趣帮助我的人,我正在为每台设备进行硬编码。我目前正在硬编码320x568,即iPhone 5和5s。键盘使用的自定义尺寸为320x216pt和568x162pt。

更新:每次控制器更新其边界时,我都隐含地想要将自定义视图的框架设置为父框架的边界。可以从viewWillLayoutSubviews()和/或viewDidLayoutSubviews()完成此操作。我想设置以下帧大小。我确实得到了这些方法的大小。

viewWillLayoutSubviews()和/或viewDidLayoutSubviews?

更新子视图是否合适
  

CGRect(x:0,y:0,width:parent_width,height:parent_height)

0 个答案:

没有答案