2014-09-19 2 views
0

В моем дизайне есть кнопка для изменения xib-файла. после того, как Google в тысячу раз, я нашел решение, как показано ниже:Неправильная ориентация вида после изменения файла xib

- (IBAction)changeButtonDidPress:(id)sender 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     if (self.xibChanged) { 
      NSArray *nibObjs = [[NSBundle mainBundle] loadNibNamed:@"MyViewController" owner:self options:nil]; 
      UIView *aView = [nibObjs objectAtIndex:0]; 
      self.view = aView; 
      self.xibChanged = NO; 
     } else { 
      NSArray *nibObjs = [[NSBundle mainBundle] loadNibNamed:@"CustomViewController" owner:self options:nil]; 
      UIView *aView = [nibObjs objectAtIndex:0]; 
      self.view = aView; 
      self.xibChanged = YES; 
     } 
    }); 
} 

Но есть проблема: ориентация зрения после изменения файла XIb не является неправильным (всегда портрет, независимо от того, как я установил файл XIb)!
ps: Я также пробовал:
1) Change view in one XIB, работал хорошо, но это означает, что мне нужно создать новый контроллер, чего я никогда не хотел!
2) Single UIViewcontroller, how to switch among multiple xibs?, не работал вообще, а некоторые кнопки потеряны в новом виде!
Итак, я публикую эту проблему, кто-то сталкивался с подобной проблемой? любые хорошие идеи? Благодаря!

ответ

0

Хмм, после тысячи повторных попыток, я только что нашел обходное решение: rotate your new view that has wrong orientation.
В начале, пожалуйста, убедитесь, что xibs, используя autosizing, в противном случае вы должны сделать больше тяжелой работы!
Затем добавьте этот метод к вашему ViewController:

- (void)rotateUIView:(UIView *)aView toInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Get data of rotating view 
    CGRect bounds = [[UIScreen mainScreen] bounds]; 
    CGFloat angle = 0.0f, width = 0.0f, height = 0.0f; 
    switch (interfaceOrientation) { 
     case UIInterfaceOrientationPortraitUpsideDown: 
      angle = M_PI; 
      width = bounds.size.width; 
      height = bounds.size.height; 
      break; 
     case UIInterfaceOrientationLandscapeLeft: 
      angle = -M_PI_2; 
      height = bounds.size.width; 
      width = bounds.size.height; 
      break; 
     case UIInterfaceOrientationLandscapeRight: 
      angle = M_PI_2; 
      height = bounds.size.width; 
      width = bounds.size.height; 
      break; 
     case UIInterfaceOrientationPortrait: 
     default: 
      return; 
    } 

    // Rotate the view 
    [aView setBounds:CGRectMake(0, 0, width, height)]; 
    [aView setTransform:CGAffineTransformConcat(aView.transform, CGAffineTransformMakeRotation(angle))]; 
} 

этот метод вызова после изменения файла XIb следующим образом:

[self rotateUIView:self.view toInterfaceOrientation:[[UIApplication sharedApplication] statusBarOrientation]]; 

Тогда ориентация зрения все в порядке! Надеюсь, это тоже может решить вашу проблему!