UitableView неправильно изменяет его размер при изменении ориентации устройства
-
26-10-2019 - |
Вопрос
Это может показаться вопросом новичка, однако я новичок в 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