UITableView не меняет свой размер правильно при изменении ориентации устройства - PullRequest
1 голос
/ 01 декабря 2011

Это может показаться новичком, но я новичок в разработке для 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 ]

4 голосов
/ 01 декабря 2011

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

2 голосов
/ 02 апреля 2013

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

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

2 голосов
/ 01 декабря 2011

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

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

0 голосов
/ 02 апреля 2013

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

0 голосов
/ 01 декабря 2011

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
        self.view = self.portraitView;
    else 
        self.view = self.landscapeView;
    [tblScore reloadData];
    return YES;
}
0 голосов
/ 01 декабря 2011

Пожалуйста, проверьте autoResizing свойство просмотров.

...