在关闭自动布局的情况下更改 UIView 的高度

Posted

技术标签:

【中文标题】在关闭自动布局的情况下更改 UIView 的高度【英文标题】:Change height of UIView with autolayout turned off 【发布时间】:2015-04-27 15:34:42 【问题描述】:

关闭视图的自动布局。但是,这不起作用。我对身高没有任何限制。只有宽度等于父视图宽度。

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

【问题讨论】:

对我来说有效!确保您已连接插座并在您的 viewDidLoad 实施开始时调用 super.viewDidLoad() 【参考方案1】:

您是否在界面生成器中关闭了整个 nib 的自动布局?

您无法在界面构建器中关闭特定子视图的自动布局 - 您只能在运行时以编程方式执行此操作。

根据您所说的,您仍然有一个有效的约束。当您已经关闭自动布局时,您如何有约束?

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

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

@IBOutlet weak var heightConstraint: NSLayoutConstraint!

self.heightConstraint.constant = 200

【讨论】:

约束方法效果很好。感谢您澄清自动布局。 不错的解决方案,您值得拥有。我正在尝试以一种简单的方式更改 uiview 的高度,而不是创建一个框架,然后分配一个框架,您的解决方案非常适合我的需求。 这个解决方案在 ios 8 和 Xcode 7.2 中对我来说就像一个魅力。我使用这种技术来释放 iad 横幅在未收到广告时占用的空间。我通过将高度约束更改为 1 来做到这一点。 @mmilo 你能请 ELI5 我如何准确地创建 heightConstraint 吗?!我在界面生成器中找不到任何选项来为实际视图添加约束!约束选项被禁用。我需要调整整个视图的高度(而不是特定的子视图)。 Xcode 7.3.1。谢谢。【参考方案2】:

[编辑]

ps。正如公认的答案所说:If you have auto layout active, setting the height for your view by using the frame won't work since it'll conflict with auto layout rules。这种代码的和平改变了框架,所以如果您尝试将此代码与自动布局一起使用,它将不起作用。


[原答案]

你也可以创建一个 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)

【讨论】:

【参考方案3】:

试试这样的:

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)

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

【讨论】:

【参考方案4】:

您只需要实现 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)

【讨论】:

以上是关于在关闭自动布局的情况下更改 UIView 的高度的主要内容,如果未能解决你的问题,请参考以下文章

如何在启用自动布局的情况下更改 iOS6 中的 UIView 大小?

自动布局:使用 UIWebViews 自定义 UIView 高度约束

如何在启用自动布局的情况下根据 UILabel 的内容自动更改 UILabel 对象的高度和下方其他元素的位置

iOS 8 自定义键盘自动布局键

自动布局打开时如何以编程方式更改 UIView 的位置

使用自动布局自定义集合视图单元格的动态高度