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

时间:2015-11-25 12:19:31

标签: ios swift uiview autolayout frame

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

我有一个自定义的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(使用推断的大小,标签使用约束居中)

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。它适用于所有设备和方向。

1 个答案:

答案 0 :(得分:0)

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

替换

rootView?.addSubview(errorView)

使用:

tableFooterView = errorView