2012-05-03 2 views
2

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

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; 

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

ответ

0

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

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

Итак, я думаю, что вы позиционируете представление выбора, используя неправильные значения в 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 - ...

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

Смежные вопросы