如何在当前的UITableViewController上添加一个UIView
我很难从UITableViewController的viewDidLoad方法中添加一个子视图(UIView)
这工作:
[self.view addSubview:self.progView];
但是你可以看到表格单元格线在UIView progView中stream血。
我试过这种方法:
[self.view.superview insertSubview:self.progView aboveSubview:self.view];
这是试图将progView,UIView添加到当前视图上方的超级视图。 当我尝试这个,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出现,但似乎在桌子后面。
我尝试了上面的方法,但没有得到它的工作。 我也发现它需要太多的configuration和代码,因为它需要从头开始设置表格视图(在故事板内容易完成)。
相反,我添加了视图,我想在UITableViewController的UINavigationController视图中添加上面的UITableView,如下所示:
[self.navigationController.view addSubview:<view to add above the table view>];
这种方法要求您将UITableViewControllerembedded到UINavigationController中,但即使您不需要导航控制器,仍然可以使用这种方法并隐藏导航栏。
这实际上是非常可能和简单 – 只需要一点点重新布线。 我遇到了一个类似的情况,编码这让我加载我的表视图的顶部加载屏幕。 这种方法也可以让你使用静态表格单元格和你自己的内容。
如果您的控制器是Storyboard或XIB中的UITableViewController,并且希望在保留现有表视图的同时将self.view重新分配给标准UIView:
将这些实例variables添加到头文件中 :
IBOutlet UITableView *tableViewReference; // to keep a reference to the tableview UIView *viewReference; // a reference to the new background view
在Storyboard或XIB文件中:将UITableViewController
中的tableViewReference
连接到tableViewReference
variables。
然后在你的实现文件中 :
// 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
滚动表视图的内容。
注意:这个答案在被指出解决scheme包含边界矛盾代码后进行了编辑。 UITableViewController对它所持有的引用做了一些奇怪的事情。 一些更仔细的testing得出这个更简单的答案:)
我已经能够通过使用uiviewcontroller遏制在uitableviewcontroller顶部添加子视图。
UITableViewController实际上非常方便,当涉及到静态单元,这可能是唯一的时候,普遍的答案“只使用uitableview”可能实际上不可行。
所以我就是这么做的
- 给你的UITableViewController一个StoryBoard标识符,即MyStaticTableView
- 创build一个全新的UIViewController子类并将其称为UITableViewControllerContainer
- 将此控制器放置在故事板中的UITableViewController的位置
- 添加一个子视图到新的控制器,并将其链接到一个名为“ view_container ”
- 在你的UITableViewControllerContainer的 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
无论你添加到它将显示在你的表视图控制器上
您可以增加视图图层的zPosition。
这将使其显示在其他视图之上(默认情况下zPosition等于0)
self.progView.layer.zPosition++; [self.view addSubview:self.progView];
问题是UITableViewController
的view
属性和tableView
属性是一样的。 这意味着根视图始终是一个表视图控制器,任何作为子视图添加的东西都将受到表视图function的约束。 这有其他不良的副作用,如你的子视图滚动时,你可能不希望他们。
这里有几个选项。 你可以覆盖loadView
并安装你自己的视图和表格视图:
// note: untested - (void)loadView { self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; self.view.backgroundColor = [UIColor whiteColor]; UITableView *tblView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain ]; tblView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ; self.tableView = tblView; [self.view addSubview:tblView]; [tblView release]; }
然后,当你需要添加一个子视图时,根据需要添加它在self.tableView
下方或上方。
另一个select是创build一个UIViewController
子类,它UIViewController
你的需求。 UITableViewController
实际上不会添加太多,它实现的小function很容易被复制。 有文章喜欢重新创buildUITableViewController来增加代码重用 ,解释如何做到这一点很容易。
苹果示例“iPhoneCoreDataRecipes”正在使用一个NIB来加载一个头到一个UITableView。 看到这里 :
我在桌子上面添加了一个图片。 我用这个代码:
self.tableView.tableHeaderView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"header.png"]];
我有类似的问题,并得到解决使用下面的代码:
[self.navigationController.view insertSubview:<subview> belowSubview:self.navigationController.navigationBar];
这使用堆栈中的控制器在正确的位置插入视图。
由于UITableViewController是UIViewController的子类,因此您需要将所需的视图添加到其超级视图中。
Swift: self.view.superview?.addSubview(viewTobeAdded) Objective C: [self.view.superview addSubview: viewTobeAdded];
Swift解决scheme(相当于Daniel Saidi):
如果您的控制器是Storyboard或XIB中的UITableViewController,并且希望在保留现有表视图的同时将self.view重新分配给标准UIView:
@IBOutlet var tableViewReference: UITableView! var viewReference: UIView!
然后在你的实现文件中:
将这些实例variables添加到您的表视图控制器文件中:
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连接到tableViewReferencevariables。
那么你将能够添加子视图如下:
self.view.addSubView(someView)
试试: [self.view bringSubviewToFront:self.progView];
或者你可以尝试添加self.progView
到你的表的视图。
保持UIView UITableViewController中的表视图我使用一个(或多个)委托方法(UITableViewDelegate)。
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) { ... }
由于观点只能有一个接缝的超级观点,也是一个很好的解决scheme,纠正我,如果我错了。 仍然得到60fps所以这对我来说很好。
可能有理由不这样做,但这对我来说迄今为止。 如果你使用一个ap
在viewDidLayoutSubviews
里面你可以运行这个,但是一定要只运行一次
self.searchTableView = [[UITableView alloc] initWithFrame:self.tableView.frame style:UITableViewStylePlain]; self.searchTableView.backgroundColor = [UIColor purpleColor]; [self.view.superview addSubview:self.searchTableView];
我有一个类似的问题,我想在我的UITableViewController上添加一个加载指示器。 为了解决这个问题,我添加了我的UIView作为窗口的子视图。 这解决了这个问题。 我就是这么做的
-(void)viewDidLoad{ [super viewDidLoad]; //get the app delegate XYAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; //define the position of the rect based on the screen bounds CGRect loadingViewRect = CGRectMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2, 50, 50); //create the custom view. The custom view is a property of the VIewController self.loadingView = [[XYLoadingView alloc] initWithFrame:loadingViewRect]; //use the delegate's window object to add the custom view on top of the view controller [delegate.window addSubview: loadingView]; }
尝试这样的事情:
[self.tableView addSubview:overlayView]; overlayView.layer.zPosition = self.tableView.backgroundView.layer.zPosition + 1;
你可以简单地把下面的代码放在viewDidAppear中:
[self.tableView.superview addSubview:<your header view>];
iOS 11更新:
当使用AutoLayout约束到安全区域时,现在可以将子视图添加到UITableView
。 这些视图不会沿着TableView滚动。
这个例子在UITableView
的UITableViewController
之上放置一个NavigationBar下面的视图
[self.tableView addSubview:self.topBarView]; [NSLayoutConstraint activateConstraints:@[ [self.topBarView.topAnchor constraintEqualToAnchor:viewController.view.safeAreaLayoutGuide.topAnchor], [self.topBarView.leadingAnchor constraintEqualToAnchor:viewController.view.safeAreaLayoutGuide.leadingAnchor], [self.topBarView.trailingAnchor constraintEqualToAnchor:viewController.view.safeAreaLayoutGuide.trailingAnchor], [self.topBarView.heightAnchor constraintEqualToConstant:40.0] ]];