使用UIWindow作为UITableView的底部工具条

开发中可能经常会遇到需要在TableView底部添加工具条的情况,如果直接在TableVIewController的view上添加View作为工具条,会导致滚动tableView时工具条跟随滚动。

  • 第一种方法:开发中为了扩展性,控制器还是尽量使用UIViewController,这样直接在viewController的view上添加tableView,然后将工具条添加在view的最顶层即可。

  • 第二种方法:但是如果之前控价已经搭建好了,控制器使用的是UITableViewController,不好再做更改时,我们可以使用UIWindow来完成任务

步骤很简单:
创建一个UIWindow对象和UIView的toolView对象,将toolView添加到新建的window中,然后调用makeKeyAndVisible显示window即可

注意:

  • UIWindow在显示的时候是不管KeyWindow是谁,都是Level优先的,即Level最高的始终显示在最前面,级别的高低顺序从小到大为Normal < StatusBar < Alert

  • 关闭窗口后需要给置为nil
    [self.toolWindow resignKeyWindow];
    self.toolWindow = nil;

  • Xcode8创建并显示window的方法在viewDidAppear方法中调用,viewDidLoad和viewWillAppear中创建完成后显示时会报以下错误:

    报错(应用程序的窗口没有根控制器):Application windows are expected to have a root view controller at the end of application launch'
    

    如果必须在viewDidLoad方法中创建并显示window时,使用以下方法调用即可

    [self performSelector:@selector(createToolView) withObject:nil afterDelay:0]; // 最后参数可以设置延时多少秒调用
    

项目中遇到需要在TableView上使用悬浮按钮时,也可以这么搞
以下是实现代码

@interface XYTableViewController ()
@property (nonatomic, strong) UIView *toolView;
@property (nonatomic, strong) UIWindow *toolWindow;
@end

@implementation XYTableViewController
 - (void)viewDidAppear:(BOOL)animated {
  // 控制器的view显示完成后执行创建并显示window
  [super viewDidAppear:animated];

   [self createToolView];  
 }
- (void)createToolView { // 创建工具条
// 1.创建window
UIWindow *toolWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, [UIScreen mainScreen].bounds.size.height - 44, [UIScreen mainScreen].bounds.size.width, 44)];
// 设置window的等级
toolWindow.windowLevel = UIWindowLevelAlert + 1;
self.toolWindow = toolWindow;

// 2.创建UIView
UIView *toolView = [[UIView alloc] init];
toolView.backgroundColor = [UIColor blueColor];
toolView.frame = toolWindow.bounds;
self.toolView = toolView;

// 3.添加view到窗口
[self.toolWindow addSubview:self.toolView];

// 4.显示窗口
[self.toolWindow makeKeyAndVisible]; 
}

你可能感兴趣的:(使用UIWindow作为UITableView的底部工具条)