Intereting Posts
Какова цель returnObjectsAsFaults iOS: после одной анимации все остальные виды начинают анимацию Производительность системы и использование батареи при использовании акселерометра и гироскопа Как создать легенду с основным сюжетом в Swift Ошибка установки приложения: приложение отклонило ключ Info.plist Я получаю предупреждение при создании делегата Как я могу достичь полей UITableViewCell, подобных этому (рис.)? Альтернативы String SDK (http://string.co). Что использовать вместо этого Могу ли я использовать подписки в своем приложении с помощью CloudKit, когда пользователь не входит в iCloud? UITableView: включить разделитель только в указанном разделе Использование неразрешенного идентификатора «Модель» в быстром Повторное локальное уведомление запускается немедленно – как отложить? interactivePopGestureRecognizer появляется слишком много просмотров Видео iOS 360 с использованием OpenGL ES 2.0 каковы логические шаги по использованию специального распространения iPad2 для бета-тестирования?

Странная проблема с позиционированием, когда присутствует 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; 

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

Solutions Collecting From Web of "Странная проблема с позиционированием, когда присутствует tabBar"

Насколько я знаю, в 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 также изменит его положение.