如何改变UIView的大小?

78

我在启动时无法修改我的UIView高度。

我有两个UIView,我想让一个是屏幕大小*70,另一个填补空隙。

这是我的代码:

 @IBOutlet weak var questionFrame: UIView!
 @IBOutlet weak var answerFrame: UIView!
 let screenSize:CGRect = UIScreen.mainScreen().bounds

 questionFrame.frame.size.height = screenSize.height * 0.70
 answerFrame.frame.size.height = screenSize.height * 0.30

在运行时不会影响应用程序。 我使用自动布局,但仅具有边距约束...

我做错了吗?


2
questionFrame.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height * 0.7) answerFrame.frame = (0, self.view.frame.height * 0.7, self.view.frame.width, self.view.frame.height * 0.3)这是你想要的吗? - User4
8个回答

74

Swift 3.0 中有多种方法可以实现这一点,适用于最新版本 MAY-2019

直接为视图分配高度和宽度值:

userView.frame.size.height = 0

userView.frame.size.width = 10

为框架分配CGRect

userView.frame =  CGRect(x:0, y: 0, width:0, height:0)

方法详情:

CGRect(x:X点,y:Y点,width:视图宽度,height:视图高度)

使用CGRECT的扩展方法

在任何Swift文件中添加以下扩展代码:

extension CGRect {

    init(_ x:CGFloat, _ y:CGFloat, _ w:CGFloat, _ h:CGFloat) {

        self.init(x:x, y:y, width:w, height:h)
    }
}

在您的应用程序中任何位置使用以下代码来设置视图的大小参数

userView.frame =  CGRect(1, 1, 20, 45)

66

你看看这个,应该可以用。

questionFrame.frame = CGRectMake(0 , 0, self.view.frame.width, self.view.frame.height * 0.7) 

answerFrame.frame =  CGRectMake(0 , self.view.frame.height * 0.7, self.view.frame.width, self.view.frame.height * 0.3)

1
刚在Xcode 7.3上尝试了一下。为了使CGRectMake()生效,UIView(我的视图实际上是从UIView子类化而来的)需要将View->Mode设置为“重绘”或“缩放以适应”,并且CGRectMake()需要在我的子类的drawRect()方法中使用。否则,故事板中的大小定义将会生效。 - rockhammer
1
它是 x y 宽 高,同时最好使用userView.frame.size.height = 10 userView.frame.size.width = 10 - user25
CGRectMake已更名为CGRect。以下代码应适用于较新的Swift版本:questionFrame.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height * 0.7)answerFrame.frame = CGRect(x: 0, y: 0, width: self.view.frame.height * 0.7, self.view.frame.width, height: self.view.frame.height * 0.3) - Jujuba

33

Swift 3和Swift 4:

myView.frame = CGRect(x: 0, y: 0, width: 0, height: 0)

20

如果您想要,可以创建此扩展。 更新 2021 Swift 5

创建文件Extends.Swift添加此代码(在要更改高度的位置添加import foundation

extension UIView {

    var x: CGFloat {
        get {
            self.frame.origin.x
        }
        set {
            self.frame.origin.x = newValue
        }
    }

    var y: CGFloat {
        get {
            self.frame.origin.y
        }
        set {
            self.frame.origin.y = newValue
        }
    }

    var height: CGFloat {
        get {
            self.frame.size.height
        }
        set {
            self.frame.size.height = newValue
        }
    }

    var width: CGFloat {
        get {
            self.frame.size.width
        }
        set {
            self.frame.size.width = newValue
        }
    }
}

用法(继承自UIView)

inheritsOfUIView.height = 100
button.height = 100
print(view.height)

1
没有初始化,就无法设置宽度等属性!初始化只是一个获取属性! - BilalReffas

2
对于类似进度条的东西,在Swift 4中,我遵循以下步骤:
  1. 创建一个UIView outlet: @IBOutlet var progressBar: UIView!
  2. 然后创建一个属性来增加其宽度值,以响应用户操作:var progressBarWidth: Int = 您的值
  3. 接着,在进度增加/减少时,使用progressBar.frame.size.width = CGFloat(progressBarWidth)
  4. 最后,在IBACtion方法中添加progressBarWidth += 您的值,以自动增加宽度,每当用户触摸按钮时。
注意:保留原有HTML标签。

1

questionFrame.frame.size.height= screenSize.height * 0.30赋值不会在视图中反映任何内容,因为它是只读属性。如果您想更改questionFrame的框架,可以使用以下代码。

questionFrame.frame = CGRect(x: 0, y: 0, width: 0, height: screenSize.height * 0.70)

1

您可以在Interface Builder中完成以下操作:

  1. 从框架视图(例如questionFrame)向主视图进行控制拖动,在弹出窗口中选择等高

  2. 然后进入框架的大小检查器,单击编辑与Superview等高约束条件,将乘数设置为0.7并按回车键。

您会看到约束条件已从等高于...更改为与...成比例


0

我知道这个问题已经有解决方案了,但我找到了一个替代方法,也许可以帮助到其他人。

我在设置子视图的框架时遇到了麻烦,因为某些值是相对于主视图的位置而言的。所以,如果你不想通过改变整个CGRect来更新你的框架,你可以简单地改变框架的一个值,然后更新它。

// keep reference to you frames
var questionView = questionFrame.frame
var answerView = answerFrame.frame

// update the values of the copy        
questionView.size.height = CGFloat(screenSize.height * 0.70)
answerView.size.height = CGFloat(screenSize.height * 0.30)

// set the frames to the new frames
questionFrame.frame = questionView
answerFrame.frame = answerView

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