2

我们有一个带有 UIPickerView 和工具栏 (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;

它在视图位于标签栏正上方的情况下完美运行。

4

1 回答 1

0

据我所知,在 viewDidLoad 中self.view还没有添加到超级视图中,因此框架没有设置为正确的大小。

例如,您可以在 InterfaceBuilder 中设计一个 UIView,它将具有 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 - ...

并且(对于额外的点:)您可以将选择器视图的自动调整大小掩码设置为灵活顶部(或锁定底部坐标)。如果这样做,即使您将选取器视图放置在 viewDidLoad 中,然后 self.view 调整大小,选取器视图也会改变它的位置。

于 2012-05-03T15:07:54.450 回答