除非等于 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
添加子视图,而是使用它的tableFooterView
和tableHeaderView
属性:
替换
rootView?.addSubview(errorView)
与:
tableFooterView = errorView
【讨论】:
以上是关于除非等于 UIView 框架,否则框架不会正确更改的主要内容,如果未能解决你的问题,请参考以下文章
将 UIView 框架设置为等于 View.Frame 或 View.Bounds 不会使用整个屏幕
除非调整大小,否则框架不显示组件 (JAVA AWT)。无法修复
在 cellForItemAtIndexPath 中的 UICollectionViewCell 中更改 UIView 的框架