1、MJPopupBackgroundView

  • 1.1 MJPopupBackgroundView.h

    //
    // MJPopupBackgroundView.h
    // watched
    //
    // Created by Martin Juhasz on 18.06.12.
    // Copyright (c) 2012 martinjuhasz.de. All rights reserved.
    // #import <UIKit/UIKit.h> @interface MJPopupBackgroundView : UIView @end
  • 1.2 MJPopupBackgroundView.h

    //
    // MJPopupBackgroundView.m
    // watched
    //
    // Created by Martin Juhasz on 18.06.12.
    // Copyright (c) 2012 martinjuhasz.de. All rights reserved.
    // #import "MJPopupBackgroundView.h" @implementation MJPopupBackgroundView - (void)drawRect:(CGRect)rect
    {
    CGContextRef context = UIGraphicsGetCurrentContext();
    size_t locationsCount = 2;
    CGFloat locations[2] = {0.0f, 1.0f};
    CGFloat colors[8] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.75f};
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, locationsCount);
    CGColorSpaceRelease(colorSpace); CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
    float radius = MIN(self.bounds.size.width , self.bounds.size.height) ;
    CGContextDrawRadialGradient (context, gradient, center, 0, center, radius, kCGGradientDrawsAfterEndLocation);
    CGGradientRelease(gradient);
    } @end

2、UIViewController+MJPopupViewController

  • 2.1 UIViewController+MJPopupViewController.h

    //
    // UIViewController+MJPopupViewController.h
    // MJModalViewController
    //
    // Created by Martin Juhasz on 11.05.12.
    // Copyright (c) 2012 martinjuhasz.de. All rights reserved.
    // #import <UIKit/UIKit.h> @class MJPopupBackgroundView; typedef enum {
    MJPopupViewAnimationFade = 0,
    MJPopupViewAnimationSlideBottomTop = 1,
    MJPopupViewAnimationSlideBottomBottom,
    MJPopupViewAnimationSlideTopTop,
    MJPopupViewAnimationSlideTopBottom,
    MJPopupViewAnimationSlideLeftLeft,
    MJPopupViewAnimationSlideLeftRight,
    MJPopupViewAnimationSlideRightLeft,
    MJPopupViewAnimationSlideRightRight,
    } MJPopupViewAnimation; @interface UIViewController (MJPopupViewController) @property (nonatomic, retain) UIViewController *mj_popupViewController;
    @property (nonatomic, retain) MJPopupBackgroundView *mj_popupBackgroundView; - (void)presentPopupViewController:(UIViewController*)popupViewController animationType:(MJPopupViewAnimation)animationType;
    - (void)presentPopupViewController:(UIViewController*)popupViewController animationType:(MJPopupViewAnimation)animationType dismissed:(void(^)(void))dismissed;
    - (void)dismissPopupViewControllerWithanimationType:(MJPopupViewAnimation)animationType; @end
  • 2.1 UIViewController+MJPopupViewController.m

    //
    // UIViewController+MJPopupViewController.m
    // MJModalViewController
    //
    // Created by Martin Juhasz on 11.05.12.
    // Copyright (c) 2012 martinjuhasz.de. All rights reserved.
    // #import "UIViewController+MJPopupViewController.h"
    #import <QuartzCore/QuartzCore.h>
    #import "MJPopupBackgroundView.h"
    #import <objc/runtime.h> #define kPopupModalAnimationDuration 0.35
    #define kMJPopupViewController @"kMJPopupViewController"
    #define kMJPopupBackgroundView @"kMJPopupBackgroundView"
    #define kMJSourceViewTag 23941
    #define kMJPopupViewTag 23942
    #define kMJOverlayViewTag 23945 @interface UIViewController (MJPopupViewControllerPrivate) - (UIView*)topView;
    - (void)presentPopupView:(UIView*)popupView;
    @end static NSString *MJPopupViewDismissedKey = @"MJPopupViewDismissed";
    static BOOL boards = NO;
    static BOOL MJPopupViewisShow = NO;
    ////////////////////////////////////////////////////////////////////////////
    #pragma mark -
    #pragma mark Public @implementation UIViewController (MJPopupViewController) static void * const keypath = (void*)&keypath; - (UIViewController*)mj_popupViewController {
    return objc_getAssociatedObject(self, kMJPopupViewController);
    } - (void)setMj_popupViewController:(UIViewController *)mj_popupViewController {
    objc_setAssociatedObject(self, kMJPopupViewController, mj_popupViewController, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (MJPopupBackgroundView*)mj_popupBackgroundView {
    return objc_getAssociatedObject(self, kMJPopupBackgroundView);
    } - (void)setMj_popupBackgroundView:(MJPopupBackgroundView *)mj_popupBackgroundView {
    objc_setAssociatedObject(self, kMJPopupBackgroundView, mj_popupBackgroundView, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (void)presentPopupViewController:(UIViewController*)popupViewController animationType:(MJPopupViewAnimation)animationType dismissed:(void(^)(void))dismissed
    {
    if (!MJPopupViewisShow) {
    MJPopupViewisShow = YES;
    self.mj_popupViewController = popupViewController;
    [self presentPopupView:popupViewController.view animationType:animationType dismissed:dismissed];
    }
    } - (void)presentPopupViewController:(UIViewController*)popupViewController animationType:(MJPopupViewAnimation)animationType
    {
    [self presentPopupViewController:popupViewController animationType:animationType dismissed:nil];
    } - (void)dismissPopupViewControllerWithanimationType:(MJPopupViewAnimation)animationType
    {
    MJPopupViewisShow = NO;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MJPopupViewDismiss" object:nil];
    UIView *sourceView = [self topView];
    if (sourceView.tag != kMJSourceViewTag && sourceView.tag == kMJPopupViewTag) {
    sourceView = [sourceView superview];
    }
    UIView *popupView = [sourceView viewWithTag:kMJPopupViewTag];
    UIView *overlayView = [sourceView viewWithTag:kMJOverlayViewTag]; switch (animationType) {
    case MJPopupViewAnimationSlideBottomTop:
    case MJPopupViewAnimationSlideBottomBottom:
    case MJPopupViewAnimationSlideTopTop:
    case MJPopupViewAnimationSlideTopBottom:
    case MJPopupViewAnimationSlideLeftLeft:
    case MJPopupViewAnimationSlideLeftRight:
    case MJPopupViewAnimationSlideRightLeft:
    case MJPopupViewAnimationSlideRightRight:
    [self slideViewOut:popupView sourceView:sourceView overlayView:overlayView withAnimationType:animationType];
    break; default:
    [self fadeViewOut:popupView sourceView:sourceView overlayView:overlayView];
    break;
    }
    } ////////////////////////////////////////////////////////////////////////////
    #pragma mark -
    #pragma mark View Handling - (void)presentPopupView:(UIView*)popupView animationType:(MJPopupViewAnimation)animationType
    {
    if (!MJPopupViewisShow) {
    MJPopupViewisShow = YES;
    [self presentPopupView:popupView animationType:animationType dismissed:nil];
    }
    } - (void)keyboardAppearanced
    {
    boards = YES;
    } - (void)keyboardDismissed
    {
    boards = NO;
    } - (void)presentPopupView:(UIView*)popupView animationType:(MJPopupViewAnimation)animationType dismissed:(void(^)(void))dismissed
    {
    boards = NO;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardAppearanced) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDismissed) name:UIKeyboardDidHideNotification object:nil]; UIView *sourceView = [self topView];
    sourceView.tag = kMJSourceViewTag;
    popupView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin |UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin;
    popupView.tag = kMJPopupViewTag; // check if source view controller is not in destination
    if ([sourceView.subviews containsObject:popupView]) return; // customize popupView
    popupView.layer.shadowPath = [UIBezierPath bezierPathWithRect:popupView.bounds].CGPath;
    popupView.layer.masksToBounds = YES;
    popupView.layer.shadowOffset = CGSizeMake(5, 5);
    popupView.layer.shadowRadius = 5;
    popupView.layer.shadowOpacity = 0.5;
    popupView.layer.cornerRadius = 5;
    popupView.layer.shouldRasterize = YES;
    popupView.layer.rasterizationScale = [[UIScreen mainScreen] scale]; // Add semi overlay
    UIView *overlayView = [[UIView alloc] initWithFrame:sourceView.bounds];
    overlayView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    overlayView.tag = kMJOverlayViewTag;
    overlayView.backgroundColor = [UIColor clearColor]; // BackgroundView
    self.mj_popupBackgroundView = [[MJPopupBackgroundView alloc] initWithFrame:sourceView.bounds];
    self.mj_popupBackgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.mj_popupBackgroundView.backgroundColor = [UIColor clearColor];
    self.mj_popupBackgroundView.alpha = 0.0f;
    [overlayView addSubview:self.mj_popupBackgroundView]; // Make the Background Clickable
    UIButton * dismissButton = [UIButton buttonWithType:UIButtonTypeCustom];
    dismissButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    dismissButton.backgroundColor = [UIColor clearColor];
    dismissButton.frame = sourceView.bounds;
    [overlayView addSubview:dismissButton]; popupView.alpha = 0.0f;
    [overlayView addSubview:popupView];
    [sourceView addSubview:overlayView]; [dismissButton addTarget:self action:@selector(dismissPopupViewControllerWithanimation:) forControlEvents:UIControlEventTouchUpInside];
    switch (animationType) {
    case MJPopupViewAnimationSlideBottomTop:
    case MJPopupViewAnimationSlideBottomBottom:
    case MJPopupViewAnimationSlideTopTop:
    case MJPopupViewAnimationSlideTopBottom:
    case MJPopupViewAnimationSlideLeftLeft:
    case MJPopupViewAnimationSlideLeftRight:
    case MJPopupViewAnimationSlideRightLeft:
    case MJPopupViewAnimationSlideRightRight:
    dismissButton.tag = animationType;
    [self slideViewIn:popupView sourceView:sourceView overlayView:overlayView withAnimationType:animationType];
    break;
    default:
    dismissButton.tag = MJPopupViewAnimationFade;
    [self fadeViewIn:popupView sourceView:sourceView overlayView:overlayView];
    break;
    } [self setDismissedCallback:dismissed];
    } - (UIView*)topView {
    UIViewController *recentView = self; while (recentView.parentViewController != nil) {
    recentView = recentView.parentViewController;
    }
    return recentView.view;
    } - (void)dismissPopupViewControllerWithanimation:(id)sender
    {
    if (boards)
    {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"disMissKeyBoard" object:nil];
    return ;
    }
    if ([sender isKindOfClass:[UIButton class]]) {
    UIButton* dismissButton = sender;
    switch (dismissButton.tag) {
    case MJPopupViewAnimationSlideBottomTop:
    case MJPopupViewAnimationSlideBottomBottom:
    case MJPopupViewAnimationSlideTopTop:
    case MJPopupViewAnimationSlideTopBottom:
    case MJPopupViewAnimationSlideLeftLeft:
    case MJPopupViewAnimationSlideLeftRight:
    case MJPopupViewAnimationSlideRightLeft:
    case MJPopupViewAnimationSlideRightRight:
    [self dismissPopupViewControllerWithanimationType:(int)dismissButton.tag];
    break;
    default:
    [self dismissPopupViewControllerWithanimationType:MJPopupViewAnimationFade];
    break;
    }
    } else {
    [self dismissPopupViewControllerWithanimationType:MJPopupViewAnimationFade];
    }
    } //////////////////////////////////////////////////////////////////////////////
    #pragma mark -
    #pragma mark Animations #pragma mark --- Slide - (void)slideViewIn:(UIView*)popupView sourceView:(UIView*)sourceView overlayView:(UIView*)overlayView withAnimationType:(MJPopupViewAnimation)animationType
    {
    // Generating Start and Stop Positions
    CGSize sourceSize = sourceView.bounds.size;
    CGSize popupSize = popupView.bounds.size;
    CGRect popupStartRect;
    switch (animationType) {
    case MJPopupViewAnimationSlideBottomTop:
    case MJPopupViewAnimationSlideBottomBottom:
    popupStartRect = CGRectMake((sourceSize.width - popupSize.width) / 2,
    sourceSize.height,
    popupSize.width,
    popupSize.height); break;
    case MJPopupViewAnimationSlideLeftLeft:
    case MJPopupViewAnimationSlideLeftRight:
    popupStartRect = CGRectMake(-sourceSize.width,
    (sourceSize.height - popupSize.height) / 2,
    popupSize.width,
    popupSize.height);
    break; case MJPopupViewAnimationSlideTopTop:
    case MJPopupViewAnimationSlideTopBottom:
    popupStartRect = CGRectMake((sourceSize.width - popupSize.width) / 2,
    -popupSize.height,
    popupSize.width,
    popupSize.height);
    break; default:
    popupStartRect = CGRectMake(sourceSize.width,
    (sourceSize.height - popupSize.height) / 2,
    popupSize.width,
    popupSize.height);
    break;
    }
    CGRect popupEndRect = CGRectMake((sourceSize.width - popupSize.width) / 2,
    (sourceSize.height - popupSize.height) / 2,
    popupSize.width,
    popupSize.height); // Set starting properties
    popupView.frame = popupStartRect;
    popupView.alpha = 1.0f;
    [UIView animateWithDuration:kPopupModalAnimationDuration delay:0.0f options:UIViewAnimationOptionCurveEaseOut animations:^{
    [self.mj_popupViewController viewWillAppear:NO];
    self.mj_popupBackgroundView.alpha = 1.0f;
    popupView.frame = popupEndRect;
    } completion:^(BOOL finished) {
    [self.mj_popupViewController viewDidAppear:NO];
    }];
    } - (void)slideViewOut:(UIView*)popupView sourceView:(UIView*)sourceView overlayView:(UIView*)overlayView withAnimationType:(MJPopupViewAnimation)animationType
    {
    // Generating Start and Stop Positions
    CGSize sourceSize = sourceView.bounds.size;
    CGSize popupSize = popupView.bounds.size;
    CGRect popupEndRect;
    switch (animationType) {
    case MJPopupViewAnimationSlideBottomTop:
    case MJPopupViewAnimationSlideTopTop:
    popupEndRect = CGRectMake((sourceSize.width - popupSize.width) / 2,
    -popupSize.height,
    popupSize.width,
    popupSize.height);
    break;
    case MJPopupViewAnimationSlideBottomBottom:
    case MJPopupViewAnimationSlideTopBottom:
    popupEndRect = CGRectMake((sourceSize.width - popupSize.width) / 2,
    sourceSize.height,
    popupSize.width,
    popupSize.height);
    break;
    case MJPopupViewAnimationSlideLeftRight:
    case MJPopupViewAnimationSlideRightRight:
    popupEndRect = CGRectMake(sourceSize.width,
    popupView.frame.origin.y,
    popupSize.width,
    popupSize.height);
    break;
    default:
    popupEndRect = CGRectMake(-popupSize.width,
    popupView.frame.origin.y,
    popupSize.width,
    popupSize.height);
    break;
    } [UIView animateWithDuration:kPopupModalAnimationDuration delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{
    [self.mj_popupViewController viewWillDisappear:NO];
    popupView.frame = popupEndRect;
    self.mj_popupBackgroundView.alpha = 0.0f;
    } completion:^(BOOL finished) {
    [popupView removeFromSuperview];
    [overlayView removeFromSuperview];
    [self.mj_popupViewController viewDidDisappear:NO];
    self.mj_popupViewController = nil; id dismissed = [self dismissedCallback];
    if (dismissed != nil)
    {
    ((void(^)(void))dismissed)();
    [self setDismissedCallback:nil];
    }
    }];
    } #pragma mark --- Fade
    - (void)fadeViewIn:(UIView*)popupView sourceView:(UIView*)sourceView overlayView:(UIView*)overlayView
    {
    // Generating Start and Stop Positions
    CGSize sourceSize = sourceView.bounds.size;
    CGSize popupSize = popupView.bounds.size;
    CGRect popupEndRect = CGRectMake((sourceSize.width - popupSize.width) / 2,
    (sourceSize.height - popupSize.height) / 2,
    popupSize.width,
    popupSize.height); // Set starting properties
    popupView.frame = popupEndRect;
    popupView.alpha = 0.0f; [UIView animateWithDuration:kPopupModalAnimationDuration animations:^{
    [self.mj_popupViewController viewWillAppear:NO];
    self.mj_popupBackgroundView.alpha = 0.5f;
    popupView.alpha = 1.0f;
    } completion:^(BOOL finished) {
    [self.mj_popupViewController viewDidAppear:NO];
    }];
    } - (void)fadeViewOut:(UIView*)popupView sourceView:(UIView*)sourceView overlayView:(UIView*)overlayView
    {
    [UIView animateWithDuration:kPopupModalAnimationDuration animations:^{
    [self.mj_popupViewController viewWillDisappear:NO];
    self.mj_popupBackgroundView.alpha = 0.0f;
    popupView.alpha = 0.0f;
    } completion:^(BOOL finished) {
    [popupView removeFromSuperview];
    [overlayView removeFromSuperview];
    [self.mj_popupViewController viewDidDisappear:NO];
    self.mj_popupViewController = nil; id dismissed = [self dismissedCallback];
    if (dismissed != nil)
    {
    ((void(^)(void))dismissed)();
    [self setDismissedCallback:nil];
    }
    }];
    } #pragma mark - Category Accessors #pragma mark --- Dismissed - (void)setDismissedCallback:(void(^)(void))dismissed
    {
    objc_setAssociatedObject(self, &MJPopupViewDismissedKey, dismissed, OBJC_ASSOCIATION_RETAIN);
    } - (void(^)(void))dismissedCallback
    {
    return objc_getAssociatedObject(self, &MJPopupViewDismissedKey);
    } @end

UIViewController+MJPopupViewController的更多相关文章

  1. iOS 在类别里添加成员变量的方法:objc_setAssociatedObject

    今天在github上查看MJPopupViewController这个项目,发现里面用到了objc_setAssociatedObject,用来为类别添加成员变量. 我百度之后,发现有人是这样说明的: ...

  2. OS快速开发必备

    github:https://github.com/koknine (终于改成以前的了) 当前移动互联网行业太火爆,移动端的需求日益增长,很多开发人员每天都应对着各种需求,作为一名iOS开发人员,对于 ...

  3. 不准使用xib自定义控制器view的大小

    1.AppDelegate.m // // 文 件 名:AppDelegate.m // // 版权所有:Copyright © 2018年 leLight. All rights reserved. ...

  4. UIViewController生命周期-完整版

    一.UIViewController 的生命周期 下面带 (NSObject)的方法是NSObject提供的方法.其他的都是UIViewController 提供的方法. load   (NSObje ...

  5. 拦截UIViewController的popViewController事件

    实现拦截UIViewController的pop操作有两种方式: 自定义实现返回按钮,即设置UIBarButtonItem来实现自定义的返回操作. 创建UINavigatonController的Ca ...

  6. iOS: 在UIViewController 中添加Static UITableView

    如果你直接在 UIViewController 中加入一个 UITableView 并将其 Content 属性设置为 Static Cells,此时 Xcode 会报错: Static table ...

  7. 8. UIViewController

    1. UIViewController 的认识 UIViewController在iOS开发中占据很重要的位置,iOS的整个UI开发的核心思想也是MVC的架构,从UIViewController的命名 ...

  8. 从一个控制器调到另一个控制器的[UIViewController _loadViewFromNibNamed:bundle:]崩溃

    一,现象和分析: 1.崩溃的主要地方是[UIViewController _loadViewFromNibNamed:bundle:] ,是从 A 控制器 push 到 B 控制器后, B 控制器的v ...

  9. UIViewController相关知识

    title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...

随机推荐

  1. PyCharm 2017.2.2+PyQt5+Python3.6.0

    PyCharm注册地址 http://idea.imsxm.com/ 安装的是miniconda激活虚拟环境执行pip install PyQt5pip install PyQt5-tools 从官网 ...

  2. IP Fragmentation(IP分片)

    https://www.cisco.com/c/en/us/tech/ip/index.html IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组,这一过程称为分片(Fr ...

  3. 一个分类,两个问题之ArrayList

    前段时间,在做一个商品的分类,分类有3级,类似于以下这种形式的: ---食物 ---蔬菜 ---白菜 ---材料 ---鸡肉 ....... 而我需要做的是将取得的一个商品的字符串类型的分类ID集,然 ...

  4. 模块化方案esl以及amd的依赖方式

    来自AMD设计思想的总结和思考 在之前了解es6模块化的时候有遇到过依赖循环的问题,在es6中对于模块是引用性的,而当时于es6模块化做对比的commonjs(CMD规范)对于模块是值类型(会将其缓存 ...

  5. 【转】Inter-eNB S1 切换

    本博客介绍Inter-eNB的S1切换的流程 当eNB收到测量报告,或是因为内部负荷分担等原因,触发了切换判决,进行eNB间小区间通过S1口的切换. 源eNB通过S1接口的 HANDOVER REQU ...

  6. JavaEE中的Cookie的基本使用方法

    之前一直使用的是统一登录系统,相关的登录由别的部门开发以及维护.但由于最近项目的需要,我们需要自己开发一套简单的登录功能.因此这里就涉及到了一个Cookie的功能.之前也了解过相关的内容,但这次需要独 ...

  7. java中如何将OutputStream转换为InputStream

    在不需要文件生成的情况下,直接将输出流转换成输入流.可使用下面的三种方法: 如果你曾经使用java IO编程,你会很快碰到这种情况,某个类在OutputStream上创建数据而你需要将它发送给某个需要 ...

  8. 如何平衡MMO游戏

    转自:http://blog.sina.com.cn/s/blog_9f56a65f01013eti.html 前言 这是一篇出自国外博客“Elder Game”的一篇文章,笔者觉得里面很多东西说的很 ...

  9. python的raw_input()函数。 函数的可变对象和不可变对象作为参数传递。

    python的raw_input()函数, 接受键盘输入, 其返回值是字符串类型, 所以当输入的是数字时, 如果是想参与算术运算, 必须要对其进行类型转换. python的参数传递, 对于可变对象和不 ...

  10. NBU客户端备份失败,报错error 48 client hostname could not be found

    今天在做备份时发现了这个报错.经过ping, nslookup, bpclntcmd命令检查没有发现连接或域名解析存在问题. 参考文档http://www.symantec.com/docs/TECH ...