UIPopoverPresentationController簡(jiǎn)單使用,實(shí)現(xiàn)popover

1.相關(guān)屬性

  1. sourceRect:指定箭頭所指區(qū)域的矩形框范圍蜂嗽,以sourceview的左上角為坐標(biāo)原點(diǎn)
  2. permittedArrowDirections:箭頭方向
  3. sourceView:sourceRect以這個(gè)view的左上角為原點(diǎn)
  4. barButtonItem:若有navigationController,并且從right/leftBarButtonItem點(diǎn)擊后出現(xiàn)popover,則可以把right/leftBarButtonItem看做上面說(shuō)的sourceView.默認(rèn)箭頭指向up,親測(cè)下來(lái)up是最合適的方向殃恒,所以在這種情況下可以不設(shè)置箭頭方向植旧。
UIPopoverPresentationController是UIViewController的一個(gè)屬性,所以并不需要你特地去建立
一個(gè)UIPopoverPresentationController來(lái)進(jìn)行操作离唐,而應(yīng)該建立一個(gè)UIViewController病附。

2. 效果圖

系統(tǒng)的.png

3. 代碼實(shí)現(xiàn)

  1. ViewController中的實(shí)現(xiàn):
#import "ViewController.h"
#import "PopoverViewController.h"

@interface ViewController ()<UIPopoverPresentationControllerDelegate>

@property (strong, nonatomic) UIButton *button;
@property (strong, nonatomic) PopoverViewController *buttonPopVC;
@property (strong, nonatomic) PopoverViewController *itemPopVC;
@property (strong, nonatomic) NSString *currentPop;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"item" style:UIBarButtonItemStylePlain target:self action:@selector(rightItemClick)];

    self.view.backgroundColor = [UIColor whiteColor];
    _button = [[UIButton alloc] initWithFrame:CGRectMake(20, 100, 100, 40)];
    [_button setTitle:@"button" forState:UIControlStateNormal];
    [_button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [self.view addSubview:_button];
    [_button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tableDidSelected:) name:@"click" object:nil];
}

- (void)rightItemClick{
    self.itemPopVC = [[PopoverViewController alloc] init];
    self.itemPopVC.modalPresentationStyle = UIModalPresentationPopover;
    self.itemPopVC.popoverPresentationController.barButtonItem = self.navigationItem.rightBarButtonItem;  //rect參數(shù)是以view的左上角為坐標(biāo)原點(diǎn)(0,0)
    self.itemPopVC.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUnknown; //箭頭方向,如果是baritem不設(shè)置方向亥鬓,會(huì)默認(rèn)up完沪,up的效果也是最理想的
    self.itemPopVC.popoverPresentationController.delegate = self;
    [self presentViewController:self.itemPopVC animated:YES completion:nil];

}

//處理popover上的talbe的cell點(diǎn)擊
- (void)tableDidSelected:(NSNotification *)notification {
    NSIndexPath *indexpath = (NSIndexPath *)notification.object;
    switch (indexpath.row) {
        case 0:
            self.view.backgroundColor = [UIColor greenColor];
            break;
        case 1:
            self.view.backgroundColor = [UIColor grayColor];
            break;
        case 2:
            self.view.backgroundColor = [UIColor blueColor];
            break;
        case 3:
            self.view.backgroundColor = [UIColor purpleColor];
            break;
        case 4:
            self.view.backgroundColor = [UIColor yellowColor];
            break;
    }
    if (self.buttonPopVC) {
        [self.buttonPopVC dismissViewControllerAnimated:YES completion:nil];    //我暫時(shí)使用這個(gè)方法讓popover消失,但我覺(jué)得應(yīng)該有更好的方法嵌戈,因?yàn)檫@個(gè)方法并不會(huì)調(diào)用popover消失的時(shí)候會(huì)執(zhí)行的回調(diào)覆积。
        self.buttonPopVC = nil;

    }else{
        [self.itemPopVC dismissViewControllerAnimated:YES completion:nil];
        self.itemPopVC = nil;
    }
}

- (void)buttonClick:(UIButton *)sender{
    self.buttonPopVC = [[PopoverViewController alloc] init];
    self.buttonPopVC.modalPresentationStyle = UIModalPresentationPopover;
    self.buttonPopVC.popoverPresentationController.sourceView = _button;  //rect參數(shù)是以view的左上角為坐標(biāo)原點(diǎn)(0,0)
    self.buttonPopVC.popoverPresentationController.sourceRect = _button.bounds; //指定箭頭所指區(qū)域的矩形框范圍(位置和尺寸)熟呛,以view的左上角為坐標(biāo)原點(diǎn)
    self.buttonPopVC.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUp; //箭頭方向
    self.buttonPopVC.popoverPresentationController.delegate = self;
    [self presentViewController:self.buttonPopVC animated:YES completion:nil];
}

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller{
    return UIModalPresentationNone;
}

- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController{
    return NO;   //點(diǎn)擊蒙版popover不消失宽档, 默認(rèn)yes
}

@end

  1. 自定義類(lèi)
@interface PopoverViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>
@property (strong, nonatomic) UITableView *tableView;
@property (strong, nonatomic) NSMutableArray *colorArray;

@end

#import "PopoverViewController.h"

@implementation PopoverViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView = [[UITableView alloc] initWithFrame:self.view.frame];
    [self.view addSubview:self.tableView];
    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    self.tableView.scrollEnabled = NO;

    self.colorArray = [[NSMutableArray alloc] initWithObjects:@"green",@"gray", @"blue",@"purple", @"yellow", nil];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.colorArray.count;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifer = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifer];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifer];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"%@", self.colorArray[indexPath.row]];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"click" object:indexPath];
}

//重寫(xiě)preferredContentSize,讓popover返回你期望的大小
- (CGSize)preferredContentSize {
    if (self.presentingViewController && self.tableView != nil) {
        CGSize tempSize = self.presentingViewController.view.bounds.size;
        tempSize.width = 150;
        CGSize size = [self.tableView sizeThatFits:tempSize];  //sizeThatFits返回的是最合適的尺寸惰拱,但不會(huì)改變控件的大小
        return size;
    }else {
        return [super preferredContentSize];
    }
}

- (void)setPreferredContentSize:(CGSize)preferredContentSize{
    super.preferredContentSize = preferredContentSize;
}
@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雌贱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子偿短,更是在濱河造成了極大的恐慌欣孤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昔逗,死亡現(xiàn)場(chǎng)離奇詭異降传,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)勾怒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)婆排,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人笔链,你說(shuō)我怎么就攤上這事段只。” “怎么了鉴扫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵赞枕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)炕婶,這世上最難降的妖魔是什么姐赡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮柠掂,結(jié)果婚禮上项滑,老公的妹妹穿的比我還像新娘。我一直安慰自己涯贞,他們只是感情好枪狂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著宋渔,像睡著了一般摘完。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上傻谁,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音列粪,去河邊找鬼审磁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛岂座,可吹牛的內(nèi)容都是我干的态蒂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼费什,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钾恢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鸳址,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘩蚪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后稿黍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體疹瘦,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年巡球,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了言沐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酣栈,死狀恐怖险胰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矿筝,我是刑警寧澤起便,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響缨睡,放射性物質(zhì)發(fā)生泄漏鸟悴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一奖年、第九天 我趴在偏房一處隱蔽的房頂上張望细诸。 院中可真熱鬧,春花似錦陋守、人聲如沸震贵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)猩系。三九已至,卻和暖如春中燥,著一層夾襖步出監(jiān)牢的瞬間寇甸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工疗涉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拿霉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓咱扣,卻偏偏與公主長(zhǎng)得像绽淘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闹伪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容