Automatically Sizing UIView after Adding to Window

前端 未结 6 921
孤街浪徒
孤街浪徒 2020-12-16 06:41

Note: This may be a duplicate of Subview Doesnt AutoSize When Added to Root View Controller


I have an iPad app that switches between different views in its mai

6条回答
  •  余生分开走
    2020-12-16 07:05

    Windows of iOS7 have different behaviors with windows of iOS8/9.

    Keyboard window of iOS7 and all windows of iOS8/9 always have correct orientation & size. So you can observer the size change events and update the frame of your view.

    But other windows of iOS7 always keep the portrait orientation and size. You need update transform of your view after rotation.

    You need to observer UIApplicationWillChangeStatusBarOrientationNotification and update size of your UIView like this:

    @interface MyView : UIView
    
    @end
    
    @implementation MyView
    
    - (instancetype)init
    {
        if (self = [super init]) {
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeOrientationHandler:) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];
        }
        return self;
    }
    
    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];
    }
    
    - (void)updateTransformWithOrientation:(UIInterfaceOrientation)orientation
    {
        CGFloat width = CGRectGetWidth(self.window.bounds);
        CGFloat height = CGRectGetHeight(self.window.bounds);
        if (width > height) {
            CGFloat temp = width;
            width = height;
            height = temp;
        }
        CGFloat offset = (height - width) / 2;
        CGAffineTransform transform;
        switch (orientation) {
            case UIInterfaceOrientationLandscapeLeft:
                transform = CGAffineTransformMakeTranslation(-offset, offset);
                transform = CGAffineTransformRotate(transform, -M_PI_2);
                break;
            case UIInterfaceOrientationLandscapeRight:
                transform = CGAffineTransformMakeTranslation(-offset, offset);
                transform = CGAffineTransformRotate(transform, M_PI_2);
                break;
            case UIInterfaceOrientationPortraitUpsideDown:
                transform = CGAffineTransformMakeRotation(-M_PI);
                break;
            default:
                transform = CGAffineTransformIdentity;
                break;
        }
        self.transform = transform;
        self.frame = CGRectMake(0, 0, width, height);
    }
    
    - (void)updateFrameWithOrientation:(UIInterfaceOrientation)orientation
    {
        CGFloat width = CGRectGetWidth(self.window.bounds);
        CGFloat height = CGRectGetHeight(self.window.bounds);
        if (width > height) {
            CGFloat temp = width;
            width = height;
            height = temp;
        }
        switch (orientation) {
            case UIInterfaceOrientationLandscapeLeft:
            case UIInterfaceOrientationLandscapeRight:
                self.frame = CGRectMake(0, 0, height, width);
                break;
            default:
                self.frame = CGRectMake(0, 0, width, height);
                break;
        }
    }
    
    - (void)updateWithOrientation:(UIInterfaceOrientation)orientation
    {
        BOOL isIos7 = [[UIDevice currentDevice].systemVersion floatValue] < 8.0;
        BOOL isKeyboardWindow = [self.window isKindOfClass:NSClassFromString(@"UITextEffectsWindow")];
        if (isIos7 == YES && isKeyboardWindow == NO) {
            [self updateTransformWithOrientation:orientation];
        } else {
            [self updateFrameWithOrientation:orientation];
        }
    }
    
    - (void)changeOrientationHandler:(NSNotification *)notification
    {
        [UIView animateWithDuration:0.25 animations:^{
            UIInterfaceOrientation orientation = (UIInterfaceOrientation)[notification.userInfo[UIApplicationStatusBarOrientationUserInfoKey] integerValue];
            [self updateWithOrientation:orientation];
        }];
    }
    
    @end
    

提交回复
热议问题