QQ空间HD(2)-UIPopoverController其它使用
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其它使用的更多相关文章
- QQ空间HD(1)-UIPopoverController基本使用
UIPopoverController 是iPad的专属API ViewController.m #import "ViewController.h" #import " ...
- QQ空间HD(6)-实现自定义的选项卡切换效果
DJTabbarButton.m #import "DJTabbarButton.h" @implementation DJTabbarButton - (instancetype ...
- QQ空间HD(5)-添加左侧菜单栏内容
DJIconView.m #import "DJIconView.h" @implementation DJIconView - (instancetype)initWithFra ...
- QQ空间HD(4)-设置左侧菜单栏属性
DJHomeViewController.m #import "DJHomeViewController.h" #import "DJMenuView.h" ; ...
- QQ空间HD(3)-Modal的切换效果总结
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { UIViewController ...
- iOS开发UI篇—模仿ipad版QQ空间登录界面
iOS开发UI篇—模仿ipad版QQ空间登录界面 一.实现和步骤 1.一般ipad项目在命名的时候可以加一个HD,标明为高清版 2.设置项目的文件结构,分为home和login两个部分 3.登陆界面的 ...
- QQ空间动态爬虫
作者:虚静 链接:https://zhuanlan.zhihu.com/p/24656161 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 先说明几件事: 题目的意 ...
- 仿QQ空间根据位置弹出PopupWindow显示更多操作效果
我们打开QQ空间的时候有个箭头按钮点击之后弹出PopupWindow会根据位置的变化显示在箭头的上方还是下方,比普通的PopupWindow弹在屏幕中间显示好看的多. 先看QQ空间效果图: ...
- QQ空间/朋友圈类界面的搭建
类似于QQ空间的布局主要是在说说信息.点赞.回复三大部分的自适应布局上. 当我们需要搭建类似QQ空间.微信朋友圈的界面的时候,可做如下操作: 创建一个对应的model类: 创建一个对应model类的f ...
随机推荐
- ubuntu安装eclipse tomcat的参考网址
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined解决 - Linux操作系统:Ubuntu_Centos_D ...
- BZOJ3240 [Noi2013]矩阵游戏
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- SQL Server数据同步的研究(单向/双向)
思路: 1.做中间件(简单:定时采集:复杂:分布式,订阅中心的形式,如微信的中间件:https://github.com/tencent-wechat/phxsql) 2.采用触发器的形式,有数据触发 ...
- Linux列出安装过的程序
命令行: dpkg -l apt-cache(模糊搜索apt-cache search 包名) pkgnames yum list(ubuntu下试了无效) rpm -aq(ubuntu下试了无效)
- C++11之thread线程
今天由于项目需求(其实是某门课的一个大作业,不好意思说出口啊...),想要使用多线程.相信大家一般用的是linux上的POSIX C或windows上的线程库,然而这些线程库以来于特定系统,并不“标准 ...
- QTVA-2015-198545、WooYun-2015-104148 .NET Framework Arbitrary File Permissions Modify Vul
catalog . Description . Effected Scope . Exploit Analysis . Principle Of Vulnerability . Patch Fix 1 ...
- OrCAD Capture使用记录
1.安装 ①修改host_ID为主机名称(如果填不对,安装过程会提示你再填一次):其后跟的是机子的MAC地址,用ipconfig /all 可以查看. ②下一行的FLEMlm,后面跟的是文件cdslm ...
- RESTful的理解
REST(Representational State Transfer ),有中文翻译为"具象状态传输"(也有:"代表性状态传输").是由 Roy Thoma ...
- CF 445B DZY Loves Chemistry(并查集)
题目链接: 传送门 DZY Loves Chemistry time limit per test:1 second memory limit per test:256 megabytes D ...
- mysql错误
安装mysql之后提示(ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:错误 具体就是: 安 ...