UIPopoverPresentationController(

2017-08-16  本文已影响0人  欧巴刚弄死他

iOS8.0开始推荐使用UIPopoverPresentationController,用于替代UIPopoverController。
UIPopoverPresentationController的使用方法类似于UIPopoverController,但是前者可以同时在iPhone和iPad上使用,这一点很不错。
UIPopoverPresentationController并不是控制器类,而是继承自NSObject,不能直接被弹出。其创建的方法发生于控制器内部的代码:

self.modalPresentationStyle = UIModalPresentationPopover;

之后可以通过控制器的属性popoverPresentationController获取该对象。
以下是控制器部分的代码,该控制器继承自UITableViewController:

#import "HHContactsMenuController.h"

static NSString *const HHContactsMenuControllerID = @"HHContactsMenuControllerID";

@implementation HHContactsMenuController {
    NSArray<NSString *> *titles;
}

- (instancetype)init {
    self = [super init];
    if (self) {
        self.view.backgroundColor = ThemeColor();
        self.modalPresentationStyle = UIModalPresentationPopover;
        CGRect rect = CGRectMake(0, 0, 110, 96);
        self.preferredContentSize = rect.size;
        self.tableView.frame = rect;
        self.tableView.backgroundColor = ThemeColor();
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:HHContactsMenuControllerID];
        self.tableView.rowHeight = 32;
        titles = @[@"创建群聊", @"管理家庭圈", @"管理好友"];
    }
    return self;
}

#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 3;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:HHContactsMenuControllerID forIndexPath:indexPath];
    
    cell.textLabel.text = titles[indexPath.row];
    cell.textLabel.textColor = UIWhiteColor();
    cell.textLabel.font = [UIFont systemFontOfSize:13];
    cell.backgroundColor = UIClearColor();
    CGFloat xx = 15;
    if (indexPath.row == 2) {
        cell.separatorInset = UIEdgeInsetsMake(0, xx, 0, tableView.frame.size.width - xx);
    } else {
        cell.separatorInset = UIEdgeInsetsMake(0, xx, 0, 0);
    }
    
    return cell;
}

@end

其中UIPopoverPresentationController的代理adaptivePresentationStyleForPresentationController:一定要实现,并且返回值必须是UIModalPresentationNone!以下是调用部分的代码:

- (void)rightBarButtonItemTapped:(id)sender {
    HHContactsMenuController *cmc = HHContactsMenuController.new;
    UIPopoverPresentationController *pop = cmc.popoverPresentationController;
    pop.barButtonItem = self.navigationItem.rightBarButtonItem;
    pop.permittedArrowDirections = UIPopoverArrowDirectionUp;
    pop.backgroundColor = ThemeColor();
    pop.delegate = self;
    [self presentViewController:cmc animated:YES completion:^{
        
    }];
}
#pragma mark- UIPopoverPresentationControllerDelegate
-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
    return UIModalPresentationNone;
}

iPad上的效果没有试过....😝

上一篇下一篇

猜你喜欢

热点阅读