使用自定义文本字段自动布局

时间:2017-01-07 21:06:09

标签: ios swift autolayout uitextfield

我正确设置了自动布局,并且可以正常工作。但是,当我在横向使用自定义UITextField类时,边框不会更改。我使用以下代码:

   required init?(coder aDecoder: (NSCoder!)) {
        super.init(coder: aDecoder)
        self.delegate=self;
        border.borderColor = UIColor(netHex: 0xc6c6c6).cgColor

        border.frame = CGRect(x: 0, y: self.frame.size.height - width, width:  self.frame.size.width, height: self.frame.size.height)
        border.borderWidth = width
        self.layer.addSublayer(border)
        self.layer.masksToBounds = true
        //self.font = UIFont(name: "System", size: CGFloat(23))
    }

    override func draw(_ rect: CGRect) {
        border.frame = CGRect(x: 0, y: self.frame.size.height - width, width:  self.frame.size.width, height: self.frame.size.height)



    }

    override func awakeFromNib() {
        super.awakeFromNib()
        border.frame = CGRect(x: 0, y: self.frame.size.height - width, width:  self.frame.size.width, height: self.frame.size.height)


    }

更改方向时,如何更改自定义边框大小。

1 个答案:

答案 0 :(得分:0)

我的应用程序需要在方向更改时更改约束。虽然可以使用大小类和特征集合,但我的需求超出了这个范围。

大小类在大多数时候都能很好地工作,堆栈控件也能很好地工作,但是我需要尽可能地最大化GLKView,从而将4个滑块从底部(纵向)移动到右侧(在横向中)。如果您使用尺寸类代码编写通用应用程序,您将很快了解到iPad的“正常”尺寸,无论其方向如何。

以下是我对此应用进行编码以检查其定位的方式。

首先,我扩展了UIView:

extension UIView {
    public func orientationHasChanged(_ isInPortrait:inout Bool) -> Bool {
        if self.frame.width > self.frame.height {
            if isInPortrait {
                isInPortrait = false
                return true
            }
        } else {
            if !isInPortrait {
                isInPortrait = true
                return true
            }
        }
        return false
    }
}

在我的视图控制器中,我有以下内容:

var initialOrientation = true
var isInPortrait = false

override func viewWillLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if initialOrientation {
        initialOrientation = false
        if view.frame.width > view.frame.height {
            isInPortrait = false
        } else {
            isInPortrait = true
        }
    } else {
        if view.orientationHasChanged(&isInPortrait) {
            // place your orientation change code here - isInPortrait will indicate which orientation the device is in
        }
    }
}

我发现viewWillLayoutSubviews()对我来说是最好的选择,因为它最初是打的,每次方向都会改变。还有其他地方 - viewDidLayoutSubviews()和viewWillTransistionTo(size :)特别是 - 但WWDC谈论使应用程序自适应第2部分也使用了它。此外,您现在拥有所需的所有视图尺寸!

要记住的关键是,在应用启动和/或方向更改期间,viewWIllLayoutSubviews()可能会被调用几次,因此您需要为其编码。制作两个Bool变量可以解决这个问题,而你的代码只运行一次。