Automatically Sizing UIView after Adding to Window

前端 未结 6 904
孤街浪徒
孤街浪徒 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:01

    Fossli's answer is correct for iPad. However, I have a universal app that I needed to support. Therefore some adjustments are necessary.

    Add the following to AppDelegate.h

    @property (strong, nonatomic) UIImageView *imageView;
    

    Add the following to AppDelegate.m

    @synthesize imageView;
    
    - (void)orientationChanged:(NSNotification *)notification
    {
        UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;   
        if (! (UIInterfaceOrientationIsLandscape(deviceOrientation) ||
               UIInterfaceOrientationIsPortrait(deviceOrientation)))
        {
            // May be "UIInterfaceOrientationUnknown" which does not appear to be a defined value anywhere.
            return;
        }
    
        [imageView setImage:[UIImage imageNamed:[Utility getBackgroundImageNameWithOrientation:deviceOrientation]]];
    
        /*
         iOS Image Sizes
    
         iPhone/iPod    Portrait 320 x 480 (640 x 960 @2x)
         iPad           Portrait 768 x 1004 (1536 x 2008 @2x)
                        Landscape 1024 x 748 (2048 x 1496 @2x)
    
         iPad window bounds in both orientations 768 x 1024  (needs manual swap in landscape)
         iPhone window bounds in both orientations 320 x 480 (needs manual swap in landscape)
    
         Note the size variations between the required default launch image sizes and
         the size of the window bounds.
         iPhone/iPod only requires rotations.
         iPad needs origin or size adjustments depending on orientation.
         */
    
        CGFloat angle = 0.0;
        CGRect newFrame = [[self window] bounds];
    
        // How to get size of status bar
        // Size of status bar gets all wonky on rotations so just set it manually
        // CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
        CGSize statusBarSize = CGSizeMake(20.0, 20.0);
    
        if (deviceOrientation == UIInterfaceOrientationPortraitUpsideDown)
        {
            angle = M_PI; 
            if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
            {
                newFrame.size.height -= statusBarSize.height;
            }
        }
        else if (deviceOrientation == UIInterfaceOrientationLandscapeLeft)
        {
            angle = - M_PI / 2.0f;        
            if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
            {
                newFrame.origin.x += statusBarSize.height;
                newFrame.size.width += statusBarSize.height;
            }
        }
        else if (deviceOrientation == UIInterfaceOrientationLandscapeRight)
        {
            angle = M_PI / 2.0f;
            if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
            {
                newFrame.size.width -= statusBarSize.height;
            }
        }
        else
        {
            angle = 0.0;
            if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
            {
                newFrame.origin.y += statusBarSize.height;
                newFrame.size.height -= statusBarSize.height;
            }
        } 
    
        imageView.transform = CGAffineTransformMakeRotation(angle);
        imageView.frame = newFrame;
    }
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {   
        // Add background image to window with orientation changes so that it is visible in all views.
        // A listener is added since subviews do not receive orientation changes.
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object: nil];
    
        UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;      
        imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[Utility getBackgroundImageNameWithOrientation:deviceOrientation]]];
        [[self window] addSubview:imageView];
    
        return YES;
    }
    

    Add the following to Utility.h

    + (NSString *)getBackgroundImageNameWithOrientation:(UIDeviceOrientation)interfaceOrientation;
    

    Add the following to Utility.m

    + (NSString *)getBackgroundImageNameWithOrientation:(UIDeviceOrientation)interfaceOrientation
    {
        NSString *imageName = nil;
    
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
        {
            if (UIInterfaceOrientationIsLandscape(interfaceOrientation))
            {
                imageName = @"Default-Landscape~ipad.png";
            }
            else
            {
                imageName = @"Default-Portrait~ipad.png";
            }
        }
        else
        {
            if (UIInterfaceOrientationIsLandscape(interfaceOrientation))
            {
                imageName = @"Default-Landscape~iphone.png";
            }
            else
            {
                imageName = @"Default.png";
            }
        }
    
        return imageName;
    }
    

提交回复
热议问题