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
}
}
Я надеюсь, что это будет полезно для вас!
Самый простой способ заключается в том, что вы можете сделать 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