除非等于 UIView 框架,否则框架不会正确更改

Posted

技术标签:

【中文标题】除非等于 UIView 框架,否则框架不会正确更改【英文标题】:Frame doesn't change properly unless is equal to UIView frame 【发布时间】:2015-11-25 12:19:30 【问题描述】:

我有一些与帧大小有关的奇怪行为,经过数小时尝试不同的事情后我无法解决。这没有任何意义。

我有一个自定义 UIView 和一个相关的 .xib 文件:

ErrorView.swift

import UIKit

class ErrorView: UIView 

@IBOutlet weak var labelErrorTitle: UILabel!
@IBOutlet weak var view: UIView!

required init(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)!
    setupView()


override init(frame: CGRect) 
    super.init(frame: frame)
    setupView()


func setupView() 
    NSBundle.mainBundle().loadNibNamed("ErrorView", owner: self, options: nil)
    self.addSubview(view)

ErrorView.xib(使用推断大小,标签使用约束居中)

我想将此视图添加到底部的自定义 UITableView。我想让它变得苗条,高度为 45,宽度为视图屏幕宽度。我想把它加到底部。

很简单!!我只是用这样的框架设置大小:

class LoadingTableView: UITableView 

var errorView: ErrorView = ErrorView () // Here is the Error View
var errorFrame: CGRect! // The frame (size) I will use

required init(coder aDecoder: NSCoder) 



override func awakeFromNib() 
    super.awakeFromNib()

    // I create the frame here to put the error at the top
    errorFrame = CGRectMake(0,0,self.frame.width,45) 

    // Init the ErrorView 
    errorView = ErrorView(frame: errorFrame)

    // I add the subview to root (I have this rootView created)
    rootView?.addSubview(errorView)




// This is needed, it updates the size when layout changes
override func layoutSubviews() 
    super.layoutSubviews()

    // Create the size again
    errorFrame = CGRectMake(0,0,self.frame.width,45)

    // I update the frame
    errorView.frame = frame

这应该有效,但它没有。只是大小很奇怪。它采用 320x568 的笔尖尺寸。然后它只是移动框架,但大小不会改变。

这就是重要的部分。如果我将 errorView.frame 的大小设置为 .frame,这是 tableView 的框架,那么它就可以工作了!随着方向的变化等等!

但只要我将框架更改为自定义大小,无论是在 awakeFromNib 或 layoutSubviews 中,它都不会,并且开始表现得很奇怪。

为什么它保持笔尖的大小?为什么如果我放 .frame 它应该可以工作,但自定义尺寸却不行?看起来我非常接近,这令人沮丧。

目标是说 tableView.error("errorCode") 然后出现errorView。它适用于所有设备和方向。

【问题讨论】:

你在使用自动布局吗?如果是,则更改框架不是一个好习惯,而是使用布局约束。如果不是,请尝试将要添加为子视图的translateAutoResizingMak 设置为false。在将视图添加为子视图之前。 不要将addSubview 改为UITableView,使用tableFooterView 【参考方案1】:

不要向UITableView 添加子视图,而是使用它的tableFooterViewtableHeaderView 属性:

替换

rootView?.addSubview(errorView)

与:

tableFooterView = errorView

【讨论】:

以上是关于除非等于 UIView 框架,否则框架不会正确更改的主要内容,如果未能解决你的问题,请参考以下文章

将 UIView 框架设置为等于 View.Frame 或 View.Bounds 不会使用整个屏幕

即使更改框架,UIView 高度也不会降低

除非删除 SEND 权限,否则不会收到 GCM 消息

除非调整大小,否则框架不显示组件 (JAVA AWT)。无法修复

在 cellForItemAtIndexPath 中的 UICollectionViewCell 中更改 UIView 的框架

Swift - UIView 框架不等于 UIView.layer.frame