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

StackOverflow https://stackoverflow.com/questions/8338963

Вопрос

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

Я 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 становится шире, чем указано по кадру. Так почему это происходит и как это исправить?

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

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

Это было полезно?

Решение

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, это хорошо объяснено.

Другие советы

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
    }
}

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

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

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

Пожалуйста, проверьте 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top