CGRectMake:如何计算X和Y对于UIPickerViewanimation?

我的故事板上有这个UIPickerView:

在这里输入图像说明

这里是基于Size Inspector的位置:

在这里输入图像说明

这是我的代码:

- (void)showPickerView { [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ self.picker.frame = CGRectMake(0 , 288, self.picker.frame.size.width, self.picker.frame.size.height); self.picker.hidden = NO; } completion:^(BOOL finished) { }]; } 

(经过反复试验)为了正确放置(底部)在4英寸的屏幕上,我必须设置288为Y.我不知道这个数字来自哪里。

因为如果你在这里做一些小math,你将不会得到这个数字:

iPhone屏幕高度= 1136px,pickerview高度= 216pts = 432px

如果X和Y从TOP-LEFT(0,0)测量,那么对于4英寸的屏幕,我应该使用1136 – 432 = 704 px / 2 = 352pts。 不是288点

但根据尺寸检查员的起源,这个对象从左下angular测量。 所以,X和Y的(0,0)现在从BOTTOM-LEFT测量。 你仍然不会得到这个数字。

加上,甚至更糟糕…当我在3.5英寸的模拟器上运行它没有完全显示。

如何为UIPickerView提供X和Y值,以便3.5和4英寸的视网膜显示屏完美显示?

谢谢。

1136px的大小是全屏的,你必须考虑到状态栏有20px,导航栏有44px,所以你的计算是这样的:

 1136px - 432(picker) - 40(status bar) - 88(navigation bar) = 576; 576/2 = 288px 

这就是为什么288px是为你工作。

如果你想给你的select器视图给予适当的坐标,你必须做这样的事情:

  self.picker.hidden = NO; [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ self.picker.frame = CGRectMake(0 , self.view.fra.size.height - self.picker.frame.size.height, self.picker.frame.size.width, self.picker.frame.size.height); } completion:^(BOOL finished) { }]; 

但是要小心,当你调用这个-viewDidAppear:时候,确保你调用它或调用了-viewDidAppear:之后,这一点非常重要。 由于你希望这段代码在3.5英寸和4英寸的屏幕上都能很好地工作,所以在调用这个方法之前,视图将不会被正确resize,而且框架也是不正确的,特别是当你使用storyboard或者xib创build视图控制器与视图为4英寸显示。

Robert,UIPicker的位置总是从左上angular开始测量, UIPicker坐标是uipicker中心的uipicker

例如,如果你给(0,0),它会显示四分之一的pickerview,即右下angular的季度。

由于uipicker高度固定为216,所以需要Y c0-坐标超过或= 216/2 = 108。 而要看到全宽,你需要X坐标(select器宽度/ 2)

我认为最好的方法是使用包含视图的边界属性,这应该是视图控制器的根视图。

UIPickerView的高度是216像素,如本文所示 – 初始化Picker View时默认设置此值。

所以,如果我们考虑danypata的职位,但不想手动计算导航栏高度,状态栏高度等设置值…我们可以做如下事情:

 UIPickerView *pickerView = [[UIPickerView alloc] init]; // default frame is set float pvHeight = pickerView.frame.size.height; float y = view.bounds.size.height - pvHeight; // the root view of view controller [UIView animateWithDuration:0.5f delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ self.picker.frame = CGRectMake(0 , y, pickerView.frame.size.width, pvHeight); } completion:nil];