【问题标题】:Auto layout with custom textfield带有自定义文本字段的自动布局
【发布时间】:2017-01-07 21:06:09
【问题描述】:

我正确设置了我的自动布局,它可以正常工作。但是,当我在横向使用自定义 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)


    }

当方向改变时我应该如何改变我的自定义边框大小。

【问题讨论】:

  • 这段代码和自动布局有什么关系?
  • 另外,有没有竖屏模式和横屏模式的图片看看有什么区别?
  • 对不起。问题出在边框而不是自动布局。当我改变方向时,我的自定义边框宽度不会被修改。
  • 从控制器(viewWIllLayoutSubviews 或 viewWillTransitionTo(size:))或视图(layoutSubviews)检查您的方向。根据视图边界,编写您需要的代码。
  • 我几乎给了你你需要的东西。了解视图生命周期以及方向更改时触发的内容 - 这就是我给您的功能/方法,检查视图边界(它是高度和宽度)以确定方向。在此基础上,更改边框。 (当然,对于很多事情——也许不是这个——你可以使用自动布局,以及大小和特征类)。

标签: ios swift autolayout uitextfield


【解决方案1】:

我的一个应用需要在方向改变时改变约束。虽然您可以使用尺寸类和特征集合,但我的需求不止于此。

Size 类在大多数情况下工作得很好,堆栈控件也工作得很好,但我需要尽可能地最大化 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 变量就可以解决这个问题,并且您的代码只会运行一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多