2014-12-15 2 views
1

У меня есть обычай UIView, который я хочу придерживаться в верхней части UIWindow, даже если меняется ориентация интерфейса. Вот мое мнение в портретной ориентацииКак вставить UIView в начало UIWindow на iOS 7

enter image description here

Проблема заключается в том, что до IOS 8 UIWindow системы координат не изменяется с изменением ориентации. Поэтому мне нужно сделать все вычисления вручную. Первая вещь, чтобы изменить преобразование UIView, что я с помощью этого метода

-(CGFloat)angleForOrientation:(UIInterfaceOrientation)orientation 
{ 
    CGFloat angle; 
    switch (orientation) { 
     case UIInterfaceOrientationLandscapeLeft: 
      angle = -M_PI /2.0; 
      NSLog(@"UIInterfaceOrientationLandscapeLeft"); 
      break; 

     case UIInterfaceOrientationLandscapeRight: 
      angle = M_PI /2.0; 
      NSLog(@"UIInterfaceOrientationLandscapeRight"); 
      break; 

     case UIInterfaceOrientationPortraitUpsideDown: 
      angle = M_PI; 
      NSLog(@"UIInterfaceOrientationPortraitUpsideDown"); 
      break; 

     default: 
      angle = 0; 
      NSLog(@"UIInterfaceOrientationPortrait"); 
      break; 

    } 
    return angle; 
} 

Вторая вещь, которая каким-то образом сопоставить фактические системы координат в UIWindow систему, которая остается той же координаты. Итак, как мне рассчитать фрейм пользовательского UIView, что даже когда пользователь поворачивает представление на другие ориентации, у меня будет такой же размер UIView, который прикреплен к верхней центральной части экрана? Например, это как следует вид выглядеть в ландшафте

enter image description here

Кстати это изображение генерируется из IOS 8 версии. Для чего я делаю следующее:

self.frame = CGRectMake(window.bounds.size/2-50, 0, 100, 100); 
    CGFloat angle = [self angleForOrientation:orientation]; 
    self.transform = CGAffineTransformMakeRotation(angle); 

Мне нужно сделать что-то похожее на iOS 7. Как я могу это достичь?

Спасибо за помощь!

+0

Взгляните на этот проект и на его код https://github.com/hfossli/AGWindowView – Andrea

+0

Благодаря Андреа. Это было первое, что я пробовал, но это не решило мое дело. Может быть, мне нужно внести некоторые изменения в исходный код. – kyurkchyan

ответ

1

Итак, наконец я понял, как это реализовать.

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

-(CGRect)getTopRectForBounds:(CGRect)bounds orientation:(UIInterfaceOrientation)orientation window:(UIWindow *)window 
{ 
    CGRect newRect; 
    CGFloat statusBarHeight = [self getStatusBarHeight]; 
    CGSize screenSize = window.screen.bounds.size; 
    CGFloat sW = screenSize.width; 
    CGFloat sH = screenSize.height; 
    CGFloat W = rect.size.width; 
    CGFloat H = rect.size.height; 
    switch (orientation) { 
     case UIInterfaceOrientationLandscapeLeft: 
      newRect = CGRectMake(statusBarHeight, (sH-W)/2, H,W); 
      break; 
     case UIInterfaceOrientationLandscapeRight: 
      newRect = CGRectMake(sW-H-statusBarHeight, (sH-W)/2, H,W); 
      break; 
     case UIInterfaceOrientationPortraitUpsideDown: 
      newRect = CGRectMake((sW-W)/2, sH-H-statusBarHeight, W,H); 
      break; 
     default: 
      newRect = CGRectMake((sW-W)/2, statusBarHeight, W,H); 
      break; 
    } 
    return newRect; 
} 

Затем я просто меняю рамку при изменении ориентации. Итак, сначала я слушаю Ориентация изменения

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameOrOrientationChanged:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameOrOrientationChanged:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil]; 

Затем в обработчике события изменения ориентации и изменить преобразование и кадр. (См мой вопрос, чтобы увидеть метод, который обрабатывает преобразования)

CGRect bounds = CGRectMake(0, 0, 100, 100); 
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 
self.frame = [self getTopRectForBounds:bounds orientation:orientation window:self.window] 
CGFloat angle = [self angleForOrientation:orientation]; 
self.transform = CGAffineTransformMakeRotation(angle); 
Смежные вопросы