CGRectMake:如何计算 UIPickerView 动画的 X 和 Y?
Posted
技术标签:
【中文标题】CGRectMake:如何计算 UIPickerView 动画的 X 和 Y?【英文标题】:CGRectMake : How To Calculate X and Y For UIPickerView Animation? 【发布时间】:2013-09-13 07:35:25 【问题描述】:我的故事板上有这个 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。我不知道这个数字是从哪里来的。
因为如果你在这里做一些小数学,你不会得到那个数字:
iPhone 屏幕高度 = 1136px,pickerview 高度 = 216pts = 432px
如果 X 和 Y 从 TOP-LEFT (0, 0) 测量,那么对于 4 英寸屏幕,我应该使用 1136 - 432 = 704 px / 2 = 352pts。不是 288 分。
但是根据 Size Inspector 的原点,这个对象是从左下角开始测量的。因此,现在从左下角测量 X 和 Y 的 (0,0)。你仍然不会得到那个号码。
另外,更糟糕的是……当我在 3.5 英寸模拟器上运行时,它并没有完全显示出来。
如何为 UIPickerView 提供 X 和 Y 值,以便在 3.5 和 4 英寸视网膜显示屏上完美显示?
谢谢。
【问题讨论】:
【参考方案1】:1136px
的大小是全屏的,你必须考虑状态栏有20px,导航栏有44px,所以你的计算是这样的:
1136px - 432(picker) - 40(status bar) - 88(navigation bar) = 576; 576/2 = 288px
这就是 288px 适合您的原因。
如果您想为您的选择器视图提供正确的坐标,您必须执行以下操作:
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:
时或之后调用它。由于您希望这段代码在 3.5 英寸和 4 英寸屏幕上都能完美运行,因此在调用此方法之前,视图不会正确调整大小并且框架不正确,特别是如果您使用带有或的情节提要xib 创建具有 4 英寸显示视图的视图控制器。
【讨论】:
@RobertHanson 您可以查看我编辑的答案以获得一些额外的说明。【参考方案2】:罗伯特,
UIPicker 的位置总是从左上角开始测量,
UIPicker 坐标是uipicker
的中心坐标。
例如,如果您给出 (0,0),它将显示pickerview 的四分之一,即右下角。
由于 uipicker 高度固定为 216,因此您需要 Y c0 坐标大于 or=216/2=108。 要查看全宽,您需要 X 坐标(选择器宽度/2)
【讨论】:
【参考方案3】:我认为最好的方法是使用包含视图的 bounds 属性,它应该是视图控制器的根视图。
UIPickerView 高度为 216 像素,如 this post 所示 - 默认情况下,该值在 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];
【讨论】:
我在 view.bounds.size.height 上定义视图时遇到问题,我尝试了“ViewController”、“View”和“view”,但都失败了。我知道你的意思,但是因为我是 Objective-C 的新手,所以我仍然不知道如何选择“视图” 我不太清楚你所说的“difini”是什么意思? 这是我的界面文件:@interface ViewController : UIViewControllerself.view
或_view
。
我忘记在我的界面文件中将 UIView 声明为属性。现在完成了...谢谢...以上是关于CGRectMake:如何计算 UIPickerView 动画的 X 和 Y?的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 4.5.2:如何正确编程 CGRectMake?