상태 표시줄 클릭 끝

2517 단어
1. 사용자 정의 윈도우 2, 좌표계 변환 3, 이 컨트롤이 메인 창에 4를 표시할지 여부를 판단하고, 창의 표시 색을 판단합니다
사용자 정의 윈도우가 상태 표시줄에 덮여 있습니다. 이전에 오류가 발생한 적이 있습니다. rootViewController가 없기 때문입니다. 나중에 dispatch_after는 괜찮아요.
//
//  BSTopWindow.m
//   
//
//  Created by lxy on 16/6/6.
//  Copyright © 2016  lxy. All rights reserved.
//

#import "BSTopWindow.h"

@implementation BSTopWindow

//  
static UIWindow *_window;

//  
+ (void)hide {
    _window.hidden = YES;
}

//  
+ (void)show {
    
    //  
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        _window = [[UIWindow alloc] init];
        _window.windowLevel = UIWindowLevelAlert;
        _window.frame = [UIApplication sharedApplication].statusBarFrame;
        _window.backgroundColor = [UIColor clearColor];
        _window.hidden = NO;
        [_window addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(topWindowClick)]];
    });
    
}


/**
 *  , 
 */
+ (void)topWindowClick {

    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    [self searchScrollViewInView:window];
}

//  ,  
+ (void)searchScrollViewInView:(UIView *)superView {
 
    for (UIScrollView *subview in superView.subviews) {
        
        //  subView frame, nil ,  ,subview.frame subview.superview 
        CGRect newFrame = [subview.superview convertRect:subview.frame toView:[UIApplication sharedApplication].keyWindow];
        //  
//        CGRect newFrame = [subview.superview convertRect:subview.frame toView:nil];
        
        BOOL isShowingOnWindow = subview.window == [UIApplication sharedApplication].keyWindow && !subview.isHidden && subview.alpha > 0.01 &&  CGRectIntersectsRect(newFrame, winBounds);
        
        //  scrollView, 
        if ([subview isKindOfClass:[UIScrollView class]] && isShowingOnWindow) {
            CGPoint offset = subview.contentOffset;
            offset.y = -subview.contentInset.top;
            [subview setContentOffset:offset animated:YES];
        }
        
        //  
        [self searchScrollViewInView:subview];
    }
    
}
@end

다른 컨트롤러의viewDidAppear에서 숨기기
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    
    [BSTopWindow hide];
}

화면으로 돌아가서 표시해 주세요.
- (IBAction)backLogin {
   
   [BSTopWindow show];
   
   [self dismissViewControllerAnimated:YES completion:nil];
   
}

좋은 웹페이지 즐겨찾기