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 : UIViewController 并没有真正告诉我问题出在哪里。也许你的意思是你找不到 view 属性?也许使用self.view_view 我忘记在我的界面文件中将 UIView 声明为属性。现在完成了...谢谢...

以上是关于CGRectMake:如何计算 UIPickerView 动画的 X 和 Y?的主要内容,如果未能解决你的问题,请参考以下文章

如何测试 DatePickerIOS

Xcode 4.5.2:如何正确编程 CGRectMake?

按下按钮后如何动画显示 UIPickerView?

ios经验总结

为啥 scrollView.frame = CGRectMake() 不起作用

在 CGRectMake、Swift、UIkit 中使用变量