DJTestViewController.m

#import "DJTestViewController.h"
#import "DJColorTableViewController.h" @interface DJTestViewController() <DJColorControllerDelegate> @property (nonatomic,weak) UIButton *btn1;
@property (nonatomic,weak) UIButton *btn2;
@property (nonatomic,strong) UIPopoverController *popVC; @end @implementation DJTestViewController - (void)viewDidLoad { [super viewDidLoad];
self.view.backgroundColor = [UIColor blackColor]; UIButton *btn1 = [[UIButton alloc] init];
btn1.frame = CGRectMake(, , , );
[btn1 setTitle:@"测试" forState:UIControlStateNormal];
[btn1 setBackgroundColor:[UIColor greenColor]];
[self.view addSubview:btn1];
self.btn1 = btn1; [btn1 addTarget:self action:@selector(btn1DidClick:) forControlEvents:UIControlEventTouchUpInside]; UIButton *btn2 = [[UIButton alloc] init];
btn2.backgroundColor = [UIColor redColor];
btn2.frame = CGRectMake(, , , );
[btn2 setTitle:@"测试2" forState:UIControlStateNormal]; [btn2 addTarget:self action:@selector(btn2DidClick:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn2];
self.btn2 = btn2; } - (void)btn1DidClick:(UIButton *)btn { DJColorTableViewController *colorVC = [[DJColorTableViewController alloc] init];
colorVC.delegate = self; UIPopoverController *popVC = [[UIPopoverController alloc] initWithContentViewController:colorVC]; // 使popover在弹出时btn2仍然可以被点击
popVC.passthroughViews = @[self.btn2]; [popVC presentPopoverFromRect:CGRectMake(, , , ) inView:[self.btn1 superview] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; self.popVC = popVC; } - (void)btn2DidClick:(UIButton *)btn {
NSLog(@"btn2 被点击"); } // 当popover 里面的CELL被点击时调用此方法
- (void)colorTableViewController:(DJColorTableViewController *)vc didSelectedColor:(UIColor *)color { self.btn1.backgroundColor = color; [self.popVC dismissPopoverAnimated:YES]; } @end

DJColorTableViewController.h

#import <UIKit/UIKit.h>

@class DJColorTableViewController;
@protocol DJColorControllerDelegate <NSObject> @optional
- (void)colorTableViewController:(DJColorTableViewController *)vc didSelectedColor:(UIColor *)color; @end @interface DJColorTableViewController : UITableViewController @property (nonatomic,weak) id<DJColorControllerDelegate> delegate; @end

DJColorTableViewController.m

#import "DJColorTableViewController.h"

#define DJRandomColor [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1.0];

static NSUInteger numberOfROws = ;

@implementation DJColorTableViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    // 取消tableview cell分隔线
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
// 内部决定将来显示在popover里面的宽度和高度
self.preferredContentSize = CGSizeMake(, * numberOfROws); } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return numberOfROws;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *ID = @"color";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
} cell.backgroundColor = DJRandomColor;
// 取消cell选中状态
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UIColor *backgroundColor = [tableView cellForRowAtIndexPath:indexPath].backgroundColor; if ([self.delegate respondsToSelector:@selector(colorTableViewController:didSelectedColor:)]) {
[self.delegate colorTableViewController:self didSelectedColor:backgroundColor];
} } @end

UIPopoverController 需要掌握的其它要点:

1. 使popover里面的controller可以自行决定其宽高:

在本例中popover里面的controller就是DJColorTableViewController

self.preferredContentSize = CGSizeMake(,  * numberOfROws);

2. 让popover里面的发生的事件可以告诉外面(代理、通知)

3. 使popover消失

[self.popVC dismissPopoverAnimated:YES];

4. 在popover的蒙版弹出时,蒙版后面的按钮仍然可以被点击

    // 使popover在弹出时btn2仍然可以被点击
popVC.passthroughViews = @[self.btn2];

5. 使popover可以在任意View的位置被弹出,不仅仅是UIBarButtonItem

    [popVC presentPopoverFromRect:CGRectMake(, , , ) inView:[self.btn1 superview] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

方法说明:popover会在指定View的指定位置弹出。

第一个参数frame代表指定的位置。

第二个参数View代表相对于哪个View。

当然了,如果想在btn1 view的下方显示,最简便的写法如下:

    [popVC presentPopoverFromRect:self.btn1.bounds inView:self.btn1 permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

苹果这样设计可以方便popover从任何位置弹出。

QQ空间HD(2)-UIPopoverController其它使用的更多相关文章

  1. QQ空间HD(1)-UIPopoverController基本使用

    UIPopoverController 是iPad的专属API ViewController.m #import "ViewController.h" #import " ...

  2. QQ空间HD(6)-实现自定义的选项卡切换效果

    DJTabbarButton.m #import "DJTabbarButton.h" @implementation DJTabbarButton - (instancetype ...

  3. QQ空间HD(5)-添加左侧菜单栏内容

    DJIconView.m #import "DJIconView.h" @implementation DJIconView - (instancetype)initWithFra ...

  4. QQ空间HD(4)-设置左侧菜单栏属性

    DJHomeViewController.m #import "DJHomeViewController.h" #import "DJMenuView.h" ; ...

  5. QQ空间HD(3)-Modal的切换效果总结

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { UIViewController ...

  6. iOS开发UI篇—模仿ipad版QQ空间登录界面

    iOS开发UI篇—模仿ipad版QQ空间登录界面 一.实现和步骤 1.一般ipad项目在命名的时候可以加一个HD,标明为高清版 2.设置项目的文件结构,分为home和login两个部分 3.登陆界面的 ...

  7. QQ空间动态爬虫

    作者:虚静 链接:https://zhuanlan.zhihu.com/p/24656161 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 先说明几件事: 题目的意 ...

  8. 仿QQ空间根据位置弹出PopupWindow显示更多操作效果

    我们打开QQ空间的时候有个箭头按钮点击之后弹出PopupWindow会根据位置的变化显示在箭头的上方还是下方,比普通的PopupWindow弹在屏幕中间显示好看的多. 先看QQ空间效果图:       ...

  9. QQ空间/朋友圈类界面的搭建

    类似于QQ空间的布局主要是在说说信息.点赞.回复三大部分的自适应布局上. 当我们需要搭建类似QQ空间.微信朋友圈的界面的时候,可做如下操作: 创建一个对应的model类: 创建一个对应model类的f ...

随机推荐

  1. C语言之贪吃蛇

    利用链表的贪吃蛇,感觉自己写的时候还是有很多东西不熟悉, 1.预编译 2.很多关于系统的头文件也不是很熟悉 3.关于内存 第一个是.h头文件 #ifndef _SNAKE_H_H_H #define ...

  2. 【BZOJ-1391】order 最小割 + 最大全闭合图

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1334  Solved: 405[Submit][Statu ...

  3. 【bzoj3991】 寻宝游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3991 (题目链接) 题意 给出一个n个节点的带权树,m次操作每次修改一个关键点,求每次操作后,从其中 ...

  4. bzoj1535[POI2005]sza-template

    此题解无病呻吟,啰里啰嗦,现已加入零分作文全家桶 这题......坑死我了...... 不妨记原串长为i的前缀为prefix(i),next[i]表示prefix(i)的最长公共前后缀长度(不等于pr ...

  5. Arrya数组添加过滤条件

    var arr = new Array(); arr.push(); arr.push(); arr.push(); var rs = arr.filter(function (value,index ...

  6. [U3D 导出Xcode工程包,用Xcode给U3D脚本传递参数]

    1.导出Xcode工程 File->Building and setting,导出IOS工程(有错误会失败) 2.运行Xcode工程,在Classes文件夹的UI文件夹里,早到UnityAppC ...

  7. HDU 5925 Coconuts

    2016 CCPC 东北四省赛 D. 一道好题. 现场写崩了. 赛后LSh跟我讲了一种离散化的做法, 没听懂. 题意 一个\(R \cdot C\ (R, C\le 10^9)\) 的矩形点阵上有 $ ...

  8. CentOS 下安装

    2016年12月5日15:25:58 ----------------------------------- 通常情况下在centos下安装软件就用yum. 关键是,使用yum你要知道安装包的名字是什 ...

  9. JZOJ 1312:关灯问题

    传送门 少见的DP再DP题目.题面不短,但是可以看出来这是一道DP题.而且正解的算法复杂度应该是$O(N^3)$.而且给了部分$O(N^4)$的算法的分.可以看出来要AC是要在DP上加上优化的. 设$ ...

  10. java中Scanner和random的用法

    Scanner是默认按照行来读取数字的. 创建一个用来输入的函数 Scanner scan=new Scanner(System.in):system.in是表示从控制台输入. 然后用一个变量类接收这 ...