Подвид окна не вращается после изменения ориентации устройства - PullRequest
6 голосов
/ 15 ноября 2011

Я создаю UIView с меткой внутри AppDelegate и отображаю его так:

    [window addSubview:self.roundedCornerView];

Проблема в том, что при повороте устройства вид с меткой вообще не вращается.Текст на этикетке также имеет неправильную ориентацию.Окно в моем приложении получило другое подпредставление, которое является подпредставлением UIViewControllers, и оно отлично вращается.

Нужно ли мне создать еще один UIViewController в моем AppDelegate и прикрепить к нему созданный вид, затем создать его подкласс и разрешить ориентацию интерфейса вдля того, чтобы округлить округленныйКорнерПросмотр?

ОБНОВЛЕНИЕ Хорошо. Я попытался сделать это, создав новый ViewController и поместив его ниже, здесь есть код в моем AppDelegate:

    ActivityIndicatorWithLabelViewController *aiWithLabel = [[[ActivityIndicatorWithLabelViewController alloc] init] autorelease];
aiWithLabel.textOfTheLabel = text;

[window addSubview:aiWithLabel.view];

Класс ActivityIndicatorWithLabelViewController виден здесь:

//
//  ActivityIndicatorWithLabelViewController.m
//  LOFT
//
//  Created by Marcin Zyga on 15.11.2011.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#import "ActivityIndicatorWithLabelViewController.h"

@implementation ActivityIndicatorWithLabelViewController
@synthesize roundedCornerView;
@synthesize textActivityIndicatorLabel;
@synthesize textOfTheLabel;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView
{
}
*/


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];

    UIActivityIndicatorView *mainApplicationActivityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    mainApplicationActivityIndicatorView.frame = CGRectMake(80, 80, 40, 40);
    mainApplicationActivityIndicatorView.hidesWhenStopped = YES;


    //self.roundedCornerView = [[[UIView alloc] initWithFrame:CGRectMake(280, 400, 200, 200)] autorelease];
    self.roundedCornerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)] autorelease];
    roundedCornerView.backgroundColor = [UIColor blackColor];
    roundedCornerView.alpha = 0.9f;
    roundedCornerView.layer.cornerRadius = 12.0;
    [roundedCornerView addSubview:mainApplicationActivityIndicatorView];


    [mainApplicationActivityIndicatorView startAnimating];
    //  self.roundedCornerView.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
    //self.roundedCornerView.autoresizesSubviews = YES;



    self.textActivityIndicatorLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 150, 200, 50)];
    self.textActivityIndicatorLabel.backgroundColor = [UIColor clearColor];
    self.textActivityIndicatorLabel.textAlignment = UITextAlignmentCenter;
    self.textActivityIndicatorLabel.textColor = [UIColor whiteColor];
    self.textActivityIndicatorLabel.font = [UIFont systemFontOfSize:22];
    self.textActivityIndicatorLabel.text = @"";
    //  self.textActivityIndicatorLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth; 
    [self.roundedCornerView addSubview:textActivityIndicatorLabel]; 
    self.textActivityIndicatorLabel.text = textOfTheLabel;

    self.view.frame = CGRectMake(280, 400, 200, 200);
    [self.view addSubview:self.roundedCornerView];
    //self.view = self.roundedCornerView;

}


- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) {
        [self.textActivityIndicatorLabel removeFromSuperview];
        [self.textActivityIndicatorLabel release];

        self.textActivityIndicatorLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
        self.textActivityIndicatorLabel.backgroundColor = [UIColor clearColor];
        self.textActivityIndicatorLabel.textAlignment = UITextAlignmentCenter;
        self.textActivityIndicatorLabel.textColor = [UIColor whiteColor];
        self.textActivityIndicatorLabel.font = [UIFont systemFontOfSize:22];
        self.textActivityIndicatorLabel.text = @"Landscape";
        [self.roundedCornerView addSubview:textActivityIndicatorLabel];         

        NSLog(@"LANDSCAPE");
    }
    NSLog(@"ENTERING SUPPORTED ORIENTATION!");
    return YES;
}

@end

Как вы видите, здесь есть некоторый отладочный код.Когда я поворачиваю устройство от портрета к ландшафту, я получаю ВСТРОЕННУЮ ПОДДЕРЖКУ!а также LADNSCAPE NSLog.Удаление метки работает нормально, но когда я добавляю новую, она все равно отображается (текст) в неправильной ориентации.Что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 15 ноября 2011

UIWindow должно иметь только одно подпредставление, которое определяет корневой UIViewController. Я считаю, что UIWindow только перенаправляет события вращения в свое первое подпредставление.

Создайте отдельный контейнер UIView и переместите в него ваши подпредставления.

0 голосов
/ 11 июля 2014

Решение - это следовать ниже шаги :

  • В файле .m в SubView добавить код в верхней части интерфейсас вашей точки зрения:

    typedef NS_OPTIONS(NSUInteger, AGInterfaceOrientationMask) {
      AGInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
      AGInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
      AGInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
      AGInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
      AGInterfaceOrientationMaskLandscape = (AGInterfaceOrientationMaskLandscapeLeft | AGInterfaceOrientationMaskLandscapeRight),
      AGInterfaceOrientationMaskAll = (AGInterfaceOrientationMaskPortrait | AGInterfaceOrientationMaskLandscapeLeft | AGInterfaceOrientationMaskLandscapeRight | AGInterfaceOrientationMaskPortraitUpsideDown),
      AGInterfaceOrientationMaskAllButUpsideDown = (AGInterfaceOrientationMaskPortrait | AGInterfaceOrientationMaskLandscapeLeft | AGInterfaceOrientationMaskLandscapeRight),
    }
    
  • В файле .m дополнительного представления добавьте код

    #pragma mark - Orientation
    
    - (void)statusBarFrameOrOrientationChanged:(NSNotification *)notification
    {
      /*
      This notification is most likely triggered inside an animation block,
      therefore no animation is needed to perform this nice transition.
      */
      [self rotateAccordingToStatusBarOrientationAndSupportedOrientations];
    }
    
    - (void)rotateAccordingToStatusBarOrientationAndSupportedOrientations
    {
        UIInterfaceOrientation orientation = [self desiredOrientation];
        CGFloat angle = [self UIInterfaceOrientationAngleOfOrientation:orientation];
        CGFloat statusBarHeight = [[self class] getStatusBarHeight];
        UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation;
    
        CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
        CGRect frame = [[self class] rectInWindowBounds:self.view.window.bounds statusBarOrientation:statusBarOrientation statusBarHeight:statusBarHeight];
    
        [self setIfNotEqualTransform:transform frame:frame];
    
        CGRect rect = btnClose.frame;
        rect.origin.x = (subView.frame.origin.x+subView.frame.size.width)-(rect.size.width/2);
        rect.origin.y = subView.frame.origin.y-(rect.size.height/2);
        btnClose.frame = rect;
    }
    
    - (void)setIfNotEqualTransform:(CGAffineTransform)transform frame:(CGRect)frame
    {
        if(!CGAffineTransformEqualToTransform(self.view.transform, transform))
        {
            self.view.transform = transform;
        }
        if(!CGRectEqualToRect(self.view.frame, frame))
        {
            self.view.frame = frame;
        }
    }
    
    + (CGFloat)getStatusBarHeight
    {
        UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
        if(UIInterfaceOrientationIsLandscape(orientation))
        {
            return [UIApplication sharedApplication].statusBarFrame.size.width;
        }
        else
        {
            return [UIApplication sharedApplication].statusBarFrame.size.height;
        }
    }
    
    static BOOL IS_BELOW_IOS_7()
    {
        static BOOL answer;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            answer = [[[UIDevice currentDevice] systemVersion] floatValue] < 7.0;
        });
        return answer;
    }
    
    + (CGRect)rectInWindowBounds:(CGRect)windowBounds statusBarOrientation:(UIInterfaceOrientation)statusBarOrientation statusBarHeight:(CGFloat)statusBarHeight
    {
        CGRect frame = windowBounds;
    
        if(IS_BELOW_IOS_7())
        {
            frame.origin.x += statusBarOrientation == UIInterfaceOrientationLandscapeLeft ? statusBarHeight : 0;
            frame.origin.y += statusBarOrientation == UIInterfaceOrientationPortrait ? statusBarHeight : 0;
            frame.size.width -= UIInterfaceOrientationIsLandscape(statusBarOrientation) ? statusBarHeight : 0;
            frame.size.height -= UIInterfaceOrientationIsPortrait(statusBarOrientation) ? statusBarHeight : 0;
        }
        return frame;
    }
    
    - (UIInterfaceOrientation)desiredOrientation
    {
        UIInterfaceOrientation statusBarOrientation = [[UIApplication sharedApplication] statusBarOrientation];
        AGInterfaceOrientationMask statusBarOrientationAsMask = [self AGInterfaceOrientationMaskFromOrientation:statusBarOrientation];
        if(self.supportedInterfaceOrientations & statusBarOrientationAsMask)
        {
            return statusBarOrientation;
        }
        else
        {
            if(self.supportedInterfaceOrientations & AGInterfaceOrientationMaskPortrait)
            {
                return UIInterfaceOrientationPortrait;
            }
            else if(self.supportedInterfaceOrientations & AGInterfaceOrientationMaskLandscapeLeft)
            {
                return UIInterfaceOrientationLandscapeLeft;
            }
            else if(self.supportedInterfaceOrientations & AGInterfaceOrientationMaskLandscapeRight)
            {
                return UIInterfaceOrientationLandscapeRight;
            }
            else
            {
                return UIInterfaceOrientationPortraitUpsideDown;
            }
        }
    }
    
    -(CGFloat)UIInterfaceOrientationAngleOfOrientation:(UIInterfaceOrientation)orientation
    {
        CGFloat angle;
    
        switch (orientation)
        {
            case UIInterfaceOrientationPortraitUpsideDown:
                angle = M_PI;
                break;
            case UIInterfaceOrientationLandscapeLeft:
                angle = -M_PI_2;
                break;
            case UIInterfaceOrientationLandscapeRight:
                angle = M_PI_2;
                break;
            default:
                angle = 0.0;
                break;
        }
    
        return angle;
    }
    
    -(AGInterfaceOrientationMask)AGInterfaceOrientationMaskFromOrientation:(UIInterfaceOrientation)orientation
    {
        return 1 << orientation;
    }
    
    //If dealloc is a duplicate method then remove this dealloc method and add the unregisterFromNotifications method in dealloc.
    - (void)dealloc {
        [self unregisterFromNotifications];
    }
    
    -(void)unregisterFromNotifications
    {
        //for orientation
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidChangeStatusBarFrameNotification object:nil];
    }
    
  • Также в файле .h дополнительного представления добавьте эту строку.

    - (void)rotateAccordingToStatusBarOrientationAndSupportedOrientations;
    

Теперь пришло время использовать указанный выше код для изменения ориентации в подпредставлении.

  • При добавлении подпредставления в окне или self.viewкак это:

    [objAppDelegate.window addSubview:objViewController.view];
    
    //added this method to rotate subview according to orientation when added
    [objViewController rotateAccordingToStatusBarOrientationAndSupportedOrientations];
    

Ссылка взята из AGWindowView

0 голосов
/ 15 ноября 2011

Подвиды окон не вращаются сами по себе, они обычно вращаются с помощью контроллера представлений.

Вы можете либо добавить повернутые представления в контроллер представлений, а затем добавить их в окно,или вы можете зарегистрироваться для получения уведомлений об изменениях ориентации устройства и поворачивать их самостоятельно.

...