123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- //
- // UIView+NTES.m
- // NIMDemo
- //
- // Created by ght on 15-1-31.
- // Copyright (c) 2015年 Netease. All rights reserved.
- //
- #import "UIView+NTES.h"
- #import <objc/runtime.h>
- @implementation UIView (NTES)
- - (CGFloat)left {
- return self.frame.origin.x;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (void)setLeft:(CGFloat)x {
- CGRect frame = self.frame;
- frame.origin.x = x;
- self.frame = frame;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (CGFloat)top {
- return self.frame.origin.y;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (void)setTop:(CGFloat)y {
- CGRect frame = self.frame;
- frame.origin.y = y;
- self.frame = frame;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (CGFloat)right {
- return self.frame.origin.x + self.frame.size.width;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (void)setRight:(CGFloat)right {
- CGRect frame = self.frame;
- frame.origin.x = right - frame.size.width;
- self.frame = frame;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (CGFloat)bottom {
- return self.frame.origin.y + self.frame.size.height;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (void)setBottom:(CGFloat)bottom {
- CGRect frame = self.frame;
- frame.origin.y = bottom - frame.size.height;
- self.frame = frame;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (CGFloat)centerX {
- return self.center.x;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (void)setCenterX:(CGFloat)centerX {
- self.center = CGPointMake(centerX, self.center.y);
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (CGFloat)centerY {
- return self.center.y;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (void)setCenterY:(CGFloat)centerY {
- self.center = CGPointMake(self.center.x, centerY);
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (CGFloat)width {
- return self.frame.size.width;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (void)setWidth:(CGFloat)width {
- CGRect frame = self.frame;
- frame.size.width = width;
- self.frame = frame;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (CGFloat)height {
- return self.frame.size.height;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (void)setHeight:(CGFloat)height {
- CGRect frame = self.frame;
- frame.size.height = height;
- self.frame = frame;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (CGPoint)origin {
- return self.frame.origin;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (void)setOrigin:(CGPoint)origin {
- CGRect frame = self.frame;
- frame.origin = origin;
- self.frame = frame;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (CGSize)size {
- return self.frame.size;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- - (void)setSize:(CGSize)size {
- CGRect frame = self.frame;
- frame.size = size;
- self.frame = frame;
- }
- - (UIViewController *)viewController{
- for (UIView* next = self; next; next = next.superview) {
- UIResponder* nextResponder = [next nextResponder];
- if ([nextResponder isKindOfClass:[UIViewController class]]) {
- return (UIViewController*)nextResponder;
- }
- }
- return nil;
- }
- @end
- @implementation UIView(NTESPresent)
- static char PresentedViewAddress; //被Present的View
- static char PresentingViewAddress; //正在Present其他视图的view
- #define AnimateDuartion .25f
- - (void)presentView:(UIView*)view animated:(BOOL)animated complete:(void(^)(void)) complete{
- if (!self.window) {
- return;
- }
- [self.window addSubview:view];
- objc_setAssociatedObject(self, &PresentedViewAddress, view, OBJC_ASSOCIATION_RETAIN);
- objc_setAssociatedObject(view, &PresentingViewAddress, self, OBJC_ASSOCIATION_RETAIN);
- if (animated) {
- [self doAlertAnimate:view complete:complete];
- }else{
- view.center = self.window.center;
- }
- }
- - (UIView *)presentedView{
- UIView * view = objc_getAssociatedObject(self, &PresentedViewAddress);
- return view;
- }
- - (void)dismissPresentedView:(BOOL)animated complete:(void(^)(void)) complete{
- UIView * view = objc_getAssociatedObject(self, &PresentedViewAddress);
- if (animated) {
- [self doHideAnimate:view complete:complete];
- }else{
- [view removeFromSuperview];
- [self cleanAssocaiteObject];
- }
- }
- - (void)hideSelf:(BOOL)animated complete:(void(^)(void)) complete{
- UIView * baseView = objc_getAssociatedObject(self, &PresentingViewAddress);
- if (!baseView) {
- return;
- }
- [baseView dismissPresentedView:animated complete:complete];
- [self cleanAssocaiteObject];
- }
- - (void)onPressBkg:(id)sender{
- [self dismissPresentedView:YES complete:nil];
- }
- #pragma mark - Animation
- - (void)doAlertAnimate:(UIView*)view complete:(void(^)(void)) complete{
- CGRect bounds = view.bounds;
- // 放大
- CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"];
- scaleAnimation.duration = AnimateDuartion;
- scaleAnimation.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 1, 1)];
- scaleAnimation.toValue = [NSValue valueWithCGRect:bounds];
-
- // 移动
- CABasicAnimation *moveAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
- moveAnimation.duration = AnimateDuartion;
- moveAnimation.fromValue = [NSValue valueWithCGPoint:[self.superview convertPoint:self.center toView:nil]];
- moveAnimation.toValue = [NSValue valueWithCGPoint:self.window.center];
-
- CAAnimationGroup *group = [CAAnimationGroup animation];
- group.beginTime = CACurrentMediaTime();
- group.duration = AnimateDuartion;
- group.animations = [NSArray arrayWithObjects:scaleAnimation,moveAnimation,nil];
- group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
- group.fillMode = kCAFillModeForwards;
- group.removedOnCompletion = NO;
- group.autoreverses = NO;
-
- [self hideAllSubView:view];
-
- [view.layer addAnimation:group forKey:@"groupAnimationAlert"];
-
- __weak UIView * wself = self;
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(AnimateDuartion * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- view.layer.bounds = bounds;
- view.layer.position = wself.superview.center;
- [wself showAllSubView:view];
- if (complete) {
- complete();
- }
- });
-
- }
- - (void)doHideAnimate:(UIView*)alertView complete:(void(^)()) complete{
- if (!alertView) {
- return;
- }
- // 缩小
- CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"];
- scaleAnimation.duration = AnimateDuartion;
- scaleAnimation.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 1, 1)];
-
- CGPoint position = self.center;
- // 移动
- CABasicAnimation *moveAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
- moveAnimation.duration = AnimateDuartion;
- moveAnimation.toValue = [NSValue valueWithCGPoint:[self.superview convertPoint:self.center toView:nil]];
-
- CAAnimationGroup *group = [CAAnimationGroup animation];
- group.beginTime = CACurrentMediaTime();
- group.duration = AnimateDuartion;
- group.animations = [NSArray arrayWithObjects:scaleAnimation,moveAnimation,nil];
- group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
- group.fillMode = kCAFillModeForwards;
- group.removedOnCompletion = NO;
- group.autoreverses = NO;
-
-
- alertView.layer.bounds = self.bounds;
- alertView.layer.position = position;
- alertView.layer.needsDisplayOnBoundsChange = YES;
-
- [self hideAllSubView:alertView];
- alertView.backgroundColor = [UIColor clearColor];
-
- [alertView.layer addAnimation:group forKey:@"groupAnimationHide"];
-
- __weak UIView * wself = self;
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(AnimateDuartion * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- [alertView removeFromSuperview];
- [wself cleanAssocaiteObject];
- [wself showAllSubView:alertView];
- if (complete) {
- complete();
- }
- });
- }
- static char *HideViewsAddress = "hideViewsAddress";
- - (void)hideAllSubView:(UIView*)view{
- for (UIView * subView in view.subviews) {
- NSMutableArray *array = [[NSMutableArray alloc] init];
- if (subView.hidden) {
- [array addObject:subView];
- }
- objc_setAssociatedObject(self, &HideViewsAddress, array, OBJC_ASSOCIATION_RETAIN);
- subView.hidden = YES;
- }
- }
- - (void)showAllSubView:(UIView*)view{
- NSMutableArray *array = objc_getAssociatedObject(self,&HideViewsAddress);
- for (UIView * subView in view.subviews) {
- subView.hidden = [array containsObject:subView];
- }
- }
- - (void)cleanAssocaiteObject{
- objc_setAssociatedObject(self,&PresentedViewAddress,nil,OBJC_ASSOCIATION_RETAIN);
- objc_setAssociatedObject(self,&PresentingViewAddress,nil,OBJC_ASSOCIATION_RETAIN);
- objc_setAssociatedObject(self,&HideViewsAddress,nil, OBJC_ASSOCIATION_RETAIN);
- }
- @end
|