我们有一个带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;
它非常适用于视图位于标签栏正上方的位置。
答案 0 :(得分: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 - ...
并且(对于加分:)你可以将选择器视图的自动调整遮罩设置为Flexible Top(或者,锁定底部坐标)。如果这样做,即使您将选择器视图放在viewDidLoad中,然后self.view调整大小,选择器视图也会改变它的位置。