【发布时间】: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。
标签: ios swift uiview autolayout frame