当tabBar存在时奇怪的定位问题

我们有一个带UIPickerView plus工具栏的自定义视图(216 + 44)。 在初始化时(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尚未添加到superview中,因此框架未设置为正确的大小。

例如,您可以在InterfaceBuilder中设计UIView,它将具有320×460。 当您将其添加到超级视图时,由于底部的标签栏,它实际上会变小。 自动resize机制有助于解决这个问题。

因此,我认为您使用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(或者,锁定底部坐标)。 如果这样做,即使您将选择器视图放在viewDidLoad中,然后self.viewresize,选择器视图也会更改它的位置。