如何在当前UITableViewController上添加UIView
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在当前UITableViewController上添加UIView相关的知识,希望对你有一定的参考价值。
我很难在UITableViewController的viewDidLoad方法中添加子视图(UIView)
这有效:
[self.view addSubview:self.progView];
但是你可以通过UIView progView看到表格单元格出血。
我尝试过这种方法:
[self.view.superview insertSubview:self.progView aboveSubview:self.view];
这是尝试将progView,UIView添加到当前视图上方的superview。当我尝试这个时,UIView永远不会出现。
- 更新 -
以下是最新的尝试:
UIView *myProgView = (UIView *)self.progView; //progView is a method that returns a UIView
[self.tableView insertSubview:myProgView aboveSubview:self.tableView];
[self.tableView bringSubviewToFront:myProgView];
结果与[self.view addSubview:self.progView]相同; UIView出现但似乎在桌子后面。
我尝试了上面的方法,但没有让它工作。我还发现它需要太多的配置和代码,因为它需要从头开始设置表视图(这可以从故事板中轻松完成)。
相反,我在UITableViewController的UINavigationController视图中添加了我想在UITableView上面添加的视图,如下所示:
[self.navigationController.view addSubview:<view to add above the table view>];
这种方法要求您已将UITableViewController嵌入到UINavigationController中,但即使您不需要导航控制器,您仍然可以使用此方法并隐藏导航栏。
我在桌子上面添加了一张图片。我用过这段代码:
self.tableView.tableHeaderView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"header.png"]];
swift解决方案(相当于Daniel Saidi):
如果您的控制器是Storyboard或XIB中的UITableViewController,并且您希望在保留现有表视图的同时将self.view重新分配给标准UIView:
@IBOutlet var tableViewReference: UITableView!
var viewReference: UIView!
然后在您的实现文件中:
将这些实例变量添加到表视图控制器文件中:
override var tableView: UITableView! {
get { return tableViewReference }
set { super.tableView = newValue }
}
override var view: UIView! {
get { return viewReference }
set { super.view = newValue }
}
override func viewDidLoad() {
super.viewDidLoad()
self.edgesForExtendedLayout = UIRectEdge.None
self.extendedLayoutIncludesOpaqueBars = false
self.automaticallyAdjustsScrollViewInsets = false
//rewiring views due to add tableView as subview to superview
viewReference = UIView.init(frame: tableViewReference.frame)
viewReference.backgroundColor = tableViewReference.backgroundColor
viewReference.autoresizingMask = tableViewReference.autoresizingMask
viewReference.addSubview(tableViewReference)
}
在Storyboard或XIB文件中:将UITableViewController中的tableView连接到tableViewReference变量。
然后,您将能够添加子视图,如下所示:
self.view.addSubView(someView)
ios 11更新:
现在,当使用AutoLayout约束到安全区域时,可以将子视图添加到UITableView
。这些视图不会沿TableView滚动。
这个例子在qazxsw poi的qazxsw poi顶部的导航栏下方放置了一个视图
UITableView
您可以简单地将以下代码放在viewDidAppear中:
UITableViewController
尝试:[self.tableView addSubview:self.topBarView];
[NSLayoutConstraint activateConstraints:@[
[self.topBarView.topAnchor constraintEqualToAnchor:self.tableView.safeAreaLayoutGuide.topAnchor],
[self.topBarView.leadingAnchor constraintEqualToAnchor:self.tableView.safeAreaLayoutGuide.leadingAnchor],
[self.topBarView.trailingAnchor constraintEqualToAnchor:self.tableView.safeAreaLayoutGuide.trailingAnchor],
[self.topBarView.heightAnchor constraintEqualToConstant:40.0]
]];
或者您可以尝试将[self.tableView.superview addSubview:<your header view>];
添加到表格视图中。
为了将UIView保持在UITableViewController中的表视图之上,我使用了一个(或多个)委托方法(UITableViewDelegate)。
[self.view bringSubviewToFront:self.progView];
由于视图只能有一个看起来很好的超级视图,如果我错了,请纠正我。仍然得到60fps所以这对我来说没问题。
斯威夫特4
这是我们重新构建视图层次结构的许多答案的最简化版本。这种方法不需要故事板/笔尖的额外插座,也可以使用编程构造的实例。
self.progView
可能有理由不这样做,但到目前为止这对我有用。如果你使用ap
在override func viewDidLoad() {
super.viewDidLoad()
self.tableView.addSubview(headerView)
}
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
tableView.addSubview(overlayView) // adds view always on top
}
// if using footers in table view
tableView(_ tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) { ... }
里面你可以运行它,但确保只运行一次
class MyTableViewController: UITableViewController {
var strongTableView: UITableView?
override var tableView: UITableView! {
get {
return strongTableView ?? super.tableView
}
set {
strongTableView = newValue
}
}
override func viewDidLoad() {
super.viewDidLoad()
// theoretically we could use self.tableView = self.tableView but compiler will not let us assign a property to itself
self.tableView = self.view as? UITableView
self.view = UIView(frame: self.tableView!.frame)
self.view.addSubview(tableView)
}
}
我有一个类似的问题,我想在我的UITableViewController上添加一个加载指示器。为了解决这个问题,我将我的UIView添加为窗口的子视图。这解决了这个问题。这就是我做到的。
viewDidLayoutSubviews
尝试这样的事情:
self.searchTableView = [[UITableView alloc] initWithFrame:self.tableView.frame style:UITableViewStylePlain];
self.searchTableView.backgroundColor = [UIColor purpleColor];
[self.view.superview addSubview:self.searchTableView];
这实际上是非常可能和容易的 - 它只需要一些重新布线。我遇到了类似的情况,并将其编码为允许我在表格视图的顶部添加加载屏幕。此方法还允许您将静态表格单元格与您自己的内容一起使用。
如果您的控制器是Storyboard或XIB中的UITableViewController,并且您希望在保留现有表视图的同时将self.view重新分配给标准UIView:
将这些实例变量添加到头文件中:
IBOutlet UITableView *tableViewReference; // to keep a reference to the tableview
UIView *viewReference; // a reference to the new background view
在Storyboard或XIB文件中:将tableView
中的UITableViewController
连接到tableViewReference
变量。
然后在您的实现文件中:
// Override the default accessors of the tableview and view
- (UITableView*)tableView { return tableViewReference; }
- (UIView*)view { return viewReference; }
- (void)viewDidLoad
{
[super viewDidLoad];
// instantiate the new self.view, similar to the tableview
viewReference = [[UIView alloc] initWithFrame:tableViewReference.frame];
[viewReference setBackgroundColor:tableViewReference.backgroundColor];
viewReference.autoresizingMask = tableViewReference.autoresizingMask;
// add it as a subview
[viewReference addSubview:tableViewReference];
/* remainder of viewDidLoad */
}
虽然看起来很奇怪,但UITableViewController在幕后引用很多古怪的东西。您需要等到viewDidLoad才能进行交换。在此之后,访问者将指向正确的UIView
和UITableView
。
用法:喜欢的东西
[self.view addSubview:myView];
将在表视图前面添加一个UIView myView
,而不用myView
滚动表视图的内容。
注意:在指出解决方案包含临界矛盾代码之后,对此答案进行了编辑。 UITableViewController对它所拥有的引用做了一些奇怪的事情。一些更仔细的测试得出这个更简单的答案:)
我已经能够使用uiviewcontroller包含在uitableviewcontroller上添加子视图。
对于静态单元格而言,UITableViewController实际上非常方便,这可能是唯一一个“只使用uitableview”的常见答案实际上不可行的时候。
所以我就是这样做的。
- 给你的UITableViewController一个StoryBoard标识符,即MyStaticTableView
- 创建一个全新的UIViewController子类并将其命名为UITableViewControllerContainer
- 将此控制器放在故事板中的UITableViewController位置
- 将子视图添加到新控制器并将其链接到名为“view_container”的插座
- 在你UITableViewController容器viewDidLoad方法
添加代码如:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
UITableViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyStaticTableView"];
[self addChildViewController:vc];
[self.view_container addSubview:vc.view];
}
你可能遇到的问题:
- 如果你有额外的顶部空间,那么一定要将标志“想要全屏”添加到你的UITableViewController
- 如果它没有在你的UITableViewControllerContainer上正确调整大小
添加代码:
- (void)viewWillAppear:(BOOL)animated
{
[[self.view_container.subviews lastObject] setFrame:self.view.frame];
}
此时,您可以从UITableViewController直接访问容器视图
self.view.superview.superview
无论你添加什么,它都将显示在你的表视图控制器上
以上是关于如何在当前UITableViewController上添加UIView的主要内容,如果未能解决你的问题,请参考以下文章