Странная проблема с позиционированием, когда присутствует tabBar

У нас есть пользовательский вид с панелью инструментов UIPickerView plus (216 + 44). Во время init (viewDidLoad) это настраиваемое представление помещается под экраном, используя следующий фрагмент кода.

CGPoint newOrigin; newOrigin.x = pickerViewOutlet.frame.size.width/2; newOrigin.y = self.view.frame.size.height + ((pickerViewOutlet.frame.size.height)/2); NSLog(@"%f,%f",self.view.frame.size.height,(pickerViewOutlet.frame.size.height)/2); pickerViewOutlet.center = CGPointMake(newOrigin.x, newOrigin.y); 

Когда нажимается кнопка, это представление вытягивается с использованием следующего фрагмента кода.

  [self.view bringSubviewToFront:pickerViewOutlet]; NSLog(@"tabbar %f",self.tabBarController.tabBar.frame.size.height); CGPoint showOrigin; showOrigin.x = pickerViewOutlet.frame.size.width/2; showOrigin.y = pickerViewOutlet.center.y - pickerViewOutlet.frame.size.height; //self.tabBarController.tabBar.frame.size.height ; NSLog(@"showpicker %f,%f",pickerViewOutlet.center.y,pickerViewOutlet.frame.size.height); [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationDuration:0.5]; pickerViewOutlet.center=CGPointMake(showOrigin.x, showOrigin.y); [UIView commitAnimations]; [pickerCtrlOutlet reloadAllComponents]; 

Это прекрасно работает. Однако это не работает (часть представления находится под панелью вкладок) в присутствии нижнего контроллера панели вкладок на странице, даже если код изменен как

 showOrigin.y = pickerViewOutlet.center.y - pickerViewOutlet.frame.size.height - self.tabBarController.tabBar.frame.size.height ; 

Однако, если вышеуказанный код изменен на

 showOrigin.y = pickerViewOutlet.center.y - pickerViewOutlet.frame.size.height - self.tabBarController.tabBar.frame.size.height - 90; 

он отлично работает, где вид находится прямо над панелью вкладок.

Насколько я знаю, в viewDidLoad self.view еще не добавлен в супервизор, и, таким образом, рамка не установлена ​​на правильные размеры.

Например, вы можете создать UIView в InterfaceBuilder и иметь 320×460. Когда вы добавляете его в супервизор, он фактически станет меньше из-за нижней панели вкладок. Механизм автоматического изменения размеров помогает в этом вопросе.

Итак, я думаю, что вы позиционируете представление выбора, используя неправильные значения в viewDidLoad, а затем, когда вы используете новую позицию относительно ее старой, она все равно будет неправильной.

Вот как я писал бы это:

  [self.view bringSubviewToFront:pickerViewOutlet]; NSLog(@"tabbar %f",self.tabBarController.tabBar.frame.size.height); CGPoint showOrigin; showOrigin.x = pickerViewOutlet.frame.size.width/2; //Notice this line ----------- showOrigin.y = self.view.frame.size.height - pickerViewOutlet.frame.size.height / 2; //self.tabBarController.tabBar.frame.size.height ; NSLog(@"showpicker %f,%f",pickerViewOutlet.center.y,pickerViewOutlet.frame.size.height); [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationDuration:0.5]; pickerViewOutlet.center=CGPointMake(showOrigin.x, showOrigin.y); [UIView commitAnimations]; [pickerCtrlOutlet reloadAllComponents]; 

Уведомление showOrigin.y = self.view.frame.size.height - ...

И (для дополнительных точек 🙂 вы можете установить маски авторезистировки для представления выбора на Flexible Top (или заблокировать нижнюю координату). Если вы это сделаете, даже если вы разместите представление picker в viewDidLoad, а затем измените размер self.view, pickerview также изменит его положение.