关闭autolayout后如何更改UIView的高度

10

关闭了视图的自动布局,但是这样做并没有起作用。我对高度没有限制,只有宽度与父视图的宽度相等。

@IBOutlet weak var questionTextView: UITextView!
override func viewDidLoad() {
  var newFrame = CGRectMake(0, 0, 300, 202)
  questionView.frame = newFrame
}

对我来说它有效!确保你连接了插座,并在你的viewDidLoad实现开始时调用super.viewDidLoad() - André Slotta
4个回答

29

您在 Interface Builder 中是否关闭了整个 nib 的自动布局?

在 Interface Builder 中,您无法为特定的子视图关闭自动布局,只能在运行时以编程方式完成。

根据您所说,您仍然有约束条件。如果已经关闭了自动布局,为什么还有约束条件呢?

如果您启用了自动布局,则使用框架设置视图的高度将无效,因为它会与自动布局规则冲突。

如果您需要在启用自动布局的情况下更改视图的高度,则需要为高度约束创建一个 IBOutlet,并在运行时修改它,例如:

@IBOutlet weak var heightConstraint: NSLayoutConstraint!

self.heightConstraint.constant = 200

约束方法非常好用。感谢您对自动布局的澄清。 - Philip
很棒的解决方案,你值得拥有。我一直在尝试以一种简单的方式改变UIview的高度,而不是像创建一个框架,然后分配一个框架那样,你的解决方案很适合我的需求。 - Itai Spector
这个解决方案对我来说在iOS 8和Xcode 7.2上非常完美。当iad广告没有接收到时,我使用这种技术来释放其占用的屏幕空间。通过将高度约束改为1来实现。 - Jervisbay
@mmilo,你能否请以五岁孩子的语言告诉我如何准确地创建heightConstraint?我在界面构建器中找不到任何选项来添加实际视图的约束!约束选项被禁用了。我需要调整整个视图的高度(而不是特定的子视图)。Xcode 7.3.1。谢谢。 - user926367

3

[编辑]

PS:正如接受的答案所说:如果您启用了自动布局,则使用框架设置视图的高度将不起作用,因为它会与自动布局规则冲突。这段代码更改了框架,因此如果您尝试在自动布局中使用此代码,它将无法正常工作。


[原始答案]

您还可以创建一个UIView扩展:

UIViewExtensions.swift:

import Foundation
import UIKit

extension UIView {

    // MARK: - Frame

    /**
    Redefines the height of the view

    :param: height The new value for the view's height
    */
    func setHeight(height: CGFloat) {

        var frame: CGRect = self.frame
        frame.size.height = height

        self.frame = frame
    }

    /**
    Redefines the width of the view

    :param: width The new value for the view's width
    */
    func setWidth(width: CGFloat) {

        var frame: CGRect = self.frame
        frame.size.width = width

        self.frame = frame
    }

    /**
    Redefines X position of the view

    :param: x The new x-coordinate of the view's origin point
    */
    func setX(x: CGFloat) {

        var frame: CGRect = self.frame
        frame.origin.x = x

        self.frame = frame
    }

    /**
    Redefines Y position of the view

    :param: y The new y-coordinate of the view's origin point
    */
    func setY(y: CGFloat) {

        var frame: CGRect = self.frame
        frame.origin.y = y

        self.frame = frame
    }
}

我还添加了设置宽度、X和Y的方法。您可以在任何视图中使用该扩展,例如:

yourView.setHeght(100)

1
尝试像这样做:
var someView = UITextView(frame: CGRect(x: 0, y: 0, width: **view.bounds.size.width**, height: 123))
        someView.layer.backgroundColor = UIColor.orangeColor().CGColor
        view.addSubview(someView)

在您的情况下,使用父视图更改视图。

1
你只需要实现 translatesAutoresizingMaskIntoConstraints,并将其设置为 true,就可以通过代码编写约束条件而无需执行其他操作。
例如:view.translatesAutoresizingMaskIntoConstraints = true // 这段代码将有效
view.frame = CGRect(x: self.playerChatBackground.frame.origin.x, y:                                     
self.playerChatBackground.frame.origin.y, width: 100.0, height: 36.0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接