UITableView не меняет свой размер правильно при изменении ориентации устройства

Это может звучать как вопрос новичка, однако я новичок в разработке для iOS,

У меня есть UIWebView и UITableView на моем iPad. В shouldAutorotateToInterfaceOrientation Я изменил их размер, чтобы они выглядели так.

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {    
        if( interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
            CGRect f = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height / 2);
            self.mTextView.frame = f;
            f = CGRectMake(0, self.view.frame.size.height / 2, self.view.frame.size.width, self.view.frame.size.height / 2);
            self.mTableView.frame = f;
        }
        if( interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {     
            CGRect f = CGRectMake(0, 0, self.view.frame.size.width / 2, self.view.frame.size.height);
            self.mTextView.frame = f;
            f = CGRectMake(self.view.frame.size.width / 2, 0, self.view.frame.size.width / 2, self.view.frame.size.height);
            self.mTableView.frame = f;        
        }   
        return YES;
    }

Теперь вопрос: для первой загрузки табличное представление рисуется с правильными размерами, но когда я переключаюсь в портретный режим, затем обратно в альбомный режим, UITableView становится шире, чем указано в кадре. Так почему это происходит и как это исправить?

PS. Я пытался также установить рамки для всех ячеек в том же методе не помогло.

PSS. Это происходит только на устройстве, на симуляторе UITableView отображается правильно

6 ответов

Решение

shouldAutorotateToInterfaceOrientation: возвращает только логическое значение, указывающее, поддерживает ли контроллер представления указанную ориентацию, в этом методе не следует выполнять никаких преобразований пользовательского интерфейса, а делать все в willAnimateRotationToInterfaceOrientation:duration:,

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{    
    if( interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
        CGRect f = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height / 2);
        self.mTextView.frame = f;
        f = CGRectMake(0, self.view.frame.size.height / 2, self.view.frame.size.width, self.view.frame.size.height / 2);
        self.mTableView.frame = f;
    }
    if( interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {     
        CGRect f = CGRectMake(0, 0, self.view.frame.size.width / 2, self.view.frame.size.height);
        self.mTextView.frame = f;
        f = CGRectMake(self.view.frame.size.width / 2, 0, self.view.frame.size.width / 2, self.view.frame.size.height);
        self.mTableView.frame = f;        
    }
}

Посмотрите документацию для UIViewController, это хорошо объяснено.

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

Надеюсь, эта работа для вас.

iOS вызывает эту функцию только один раз! Чтобы сделать эту работу хорошо, как вы ожидаете, вы должны добавить эту строку в (void)viewDidLoad функция:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];

И делая (void)orientationChanged:(id)object функция:

- (void)orientationChanged:(id)object{
    UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication] statusBarOrientation;

    if(UIInterfaceOrientationIsPortrait(interfaceOrientation)){
        // some works
    }else if(UIInterfaceOrientationIsLandscape(interfaceOrientation)){
        // another works
    }
}

Я надеюсь, что это будет полезно для вас!

Пожалуйста, проверьте autoResizing Свойство взглядов.

Самый простой способ заключается в том, что вы можете сделать 2 разных вида для портретного и ландшафтного режима, поэтому при каждом изменении режима вы можете легко изменить вид. Как это:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
        self.view = self.portraitView;
    else 
        self.view = self.landscapeView;
    [tblScore reloadData];
    return YES;
}

Ты используешь AutoResizing для этого не нужно делать кодирование для фрейма. http://developer.apple.com/library/ios/#documentation/windowsviews/conceptual/viewpg_iphoneos/CreatingViews/CreatingViews.html

Другие вопросы по тегам