我们应该都有用过这个功能,你的朋友微信给你分享了一个淘宝里面的商品链接,然后当你复制这个链接打开淘宝APP的时候,就会弹出一个弹窗,像这样:
![]()
example.PNG
这个功能想必大家都挺熟悉,受这个启发我们产品也想在我们APP上添加这样一个功能,与这个不一样的是,当我们复制一段网址的时候打开我们的APP会弹出框填一些信息后上传到我们的“资源库”。大体功能就这样,所以记录一下实现的过程。
![]()
一、弹窗视图功能
.h中:两个信号一个是确定信号一个是取消信号
两个方法,一个显示一个隐藏方法
|
1
2
3
4
5
|
@property (nonatomic, strong) RACSubject *uploadSureSignal;
@property (nonatomic, strong) RACSubject *hideSucSignal;
- (
void
)show;
- (
void
)hide;
|
.m中:主要是两个textview,还有涉及到在keywindow上,IQKeyboard的一些操作
|
1
2
3
|
@property (nonatomic, assign) CGFloat keyboardHeight;
@property (nonatomic, strong) CustomUITextView *nameTV;
@property (nonatomic, strong) CustomUITextView *desTV;
|
因为发现IQKeyboard在这个弹出界面有问题,所以在显示这个界面的时候,将IQKeyboard禁用取之使用系统的keyboard监听方法
在(void)show方法中:
|
1
2
3
4
5
6
7
8
|
-(
void
)show {
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self selector:@selector(keyboardWillShowOrHide:) name:UIKeyboardWillShowNotification object:nil];
[defaultCenter addObserver:self selector:@selector(keyboardWillShowOrHide:) name:UIKeyboardWillHideNotification object:nil];
}
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
- (
void
)keyboardWillShowOrHide:(NSNotification *)notification {
NSString *notificationName = notification.name;
NSDictionary *keyboardInfo = notification.userInfo;
CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat height = keyboardFrame.size.height;
self.keyboardHeight = height;
CGRect selfViewFrame = self.bgView.frame;
if
([notificationName isEqualToString:UIKeyboardWillShowNotification]) {
selfViewFrame.origin.y = SCREEN_HEIGHT - PANELHEIGHT - height;
}
else
{
selfViewFrame.origin.y = SCREEN_HEIGHT - PANELHEIGHT;
}
NSTimeInterval duration = [keyboardInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
[UIView animateWithDuration:duration animations:^{
self.bgView.frame = selfViewFrame;
}];
}
|
同时在show方法中显示keyWindow,进而改变界面的frame进行显示
|
1
2
3
4
5
6
7
8
9
10
|
- (
void
)show {
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
[keyWindow addSubview:self];
CGRect frame = self.bgView.frame;
if
(frame.origin.y == SCREEN_HEIGHT) {
frame.origin.y = SCREEN_HEIGHT - PANELHEIGHT;
[UIView animateWithDuration:
0.4
animations:^{
self.bgView.frame = frame;
}];
}
|
hide方法这里要考虑到键盘弹出后将self.bgView向上提高后frame的变化。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
CGRect selfFrame = self.bgView.frame;
if
(selfFrame.origin.y == SCREEN_HEIGHT - PANELHEIGHT || selfFrame.origin.y == SCREEN_HEIGHT - PANELHEIGHT - self.keyboardHeight) {
[self resignFirstResponder];
selfFrame.origin.y = SCREEN_HEIGHT;
[UIView animateWithDuration:
0.4
animations:^{
self.bgView.frame = selfFrame;
} completion:^(BOOL finished) {
[IQKeyboardManager sharedManager].enable = YES;
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self removeFromSuperview];
}];
}
|
delegate中的操作
这里首先要弄懂APPdelegate中的这几个代理方法的意思:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return
YES;
}
- (
void
)applicationWillResignActive:(UIApplication *)application {
}
- (
void
)applicationDidEnterBackground:(UIApplication *)application {
}
- (
void
)applicationWillEnterForeground:(UIApplication *)application {
}
- (
void
)applicationDidBecomeActive:(UIApplication *)application {
}
- (
void
)applicationWillTerminate:(UIApplication *)application {
}
|
在上面的这些代理方法中,我们需要用到的是 applicationDidBecomeActive方法。在这个方法中我们去检查系统的粘贴板UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
if
(pasteboard.string) {
NSLog(@
"string:%@"
, pasteboard.string);
NSString *urlStr = pasteboard.string;
BOOL isPopVC = NO;
UIViewController * Rootvc = self.window.rootViewController;
if
([Rootvc isKindOfClass:[UINavigationController
class
]]) {
UINavigationController * nav = (UINavigationController *)Rootvc;
UIViewController * v = [nav.viewControllers lastObject];
if
([v isKindOfClass:[UploadResCofingVC
class
]]) {
isPopVC = YES;
}
}
if
(!self.popView && !isPopVC) {
UploadResourcesPopupView *popView = [UploadResourcesPopupView
new
];
[popView show];
self.popView = popView;
[self.popView.hideSucSignal subscribeNext:^(id x) {
@strongify(self);
self.popView = nil;
}];
}
}
}
}
|
总结
以上大体就是实现这个功能的基本思路,细节方面因项目而异了,比如我们需要判断当前用户的角色,当前用户是否登录,对弹窗视图后续的一些操作。当然并不完美,欢迎批评指正。
转自:http://www.cocoachina.com/ios/20180508/23307.html