[英]How to fix strange behavior of date picker UIView when changing screen orientation in Objective-C?
一旦用户使用datePicker
选择日期,我有这个项目需要更改应用程序的屏幕方向。 一旦用户点击Date
按钮,它将显示datePicker
第一个图像是纵向模式时datePicker
的正确布局。
将屏幕方向从Landscape 更改为 Portrait 时。 就会出现问题。 请参考下图。
一旦变成横向,下面的图像应该是正确的布局。
当您将屏幕方向更改回纵向时。 datePicker
布局已更改。 请参考下图。
不正确的纵向布局
以下是使用的代码:
- (void)resizeView:(UIInterfaceOrientation)interfaceOrientation
{
//LOG(@"interfaceOrientation=%ld", (long)interfaceOrientation);
//LOG(@"self.frame =%@", NSStringFromCGRect(self.frame));
//LOG(@"self.bounds=%@", NSStringFromCGRect(self.bounds));
CGFloat x, y, w, h;
viewBack.frame = self.bounds;
#define _HEIGHT_LABEL (40)
#define _HEIGHT_PICKER (162)
#define _HEIGHT_TOOLBAR (CGRectGetHeight(toolBar.frame))//(44)
if (interfaceOrientation == UIInterfaceOrientationPortrait)
{
LOG(@"[Portrait]");
w = CGRectGetWidth(viewBack.frame);
h = _HEIGHT_LABEL + _HEIGHT_PICKER*2 + _HEIGHT_TOOLBAR;
viewPicker.frame = CGRectMake(0, 0, w, h);
viewPicker.center = viewBack.center;
x = 0;
y = 0;
w = CGRectGetWidth(viewPicker.frame);
h = _HEIGHT_LABEL;
lblTitle.frame = CGRectMake(x, y, w, h);
x = 0;
y = CGRectGetMaxY(lblTitle.frame);
w = CGRectGetWidth(viewPicker.frame);
h = _HEIGHT_PICKER;
datePicker.frame = CGRectMake(x, y, w, h);
x = 0;
y = CGRectGetMaxY(datePicker.frame);
w = CGRectGetWidth(viewPicker.frame);
h = CGRectGetHeight(datePicker.frame); //datePickerと同じ
timePicker.frame = CGRectMake(x, y, w, h);
x = 0;
y = CGRectGetMaxY(timePicker.frame);
w = CGRectGetWidth(viewPicker.frame);
h = _HEIGHT_TOOLBAR;
toolBar.frame = CGRectMake(x, y, w, h);
//LOG(@"tool =%@", NSStringFromCGRect(toolBar.frame));
}
else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
LOG(@"[Landscape]");
w = CGRectGetWidth(viewBack.frame);
h = _HEIGHT_LABEL + _HEIGHT_PICKER + _HEIGHT_TOOLBAR;
viewPicker.frame = CGRectMake(0, 0, w, h);
viewPicker.center = viewBack.center;
x = 0;
y = 0;
w = CGRectGetWidth(viewPicker.frame);
h = _HEIGHT_LABEL;
lblTitle.frame = CGRectMake(x, y, w, h);
w = CGRectGetWidth(viewPicker.frame) / 2; //画面幅の半分
x = CGRectGetMidX(viewPicker.frame) - w;
y = CGRectGetMaxY(lblTitle.frame);
h = _HEIGHT_PICKER;
datePicker.frame = CGRectMake(x, y, w, h);
x = CGRectGetMidX(viewPicker.frame);
y = CGRectGetMinY(datePicker.frame); //datePickerと同じ
w = CGRectGetWidth(datePicker.frame); //datePickerと同じ
h = CGRectGetHeight(datePicker.frame); //datePickerと同じ
timePicker.frame = CGRectMake(x, y, w, h);
x = 0;
y = CGRectGetMaxY(datePicker.frame);
w = CGRectGetWidth(viewPicker.frame);
h = CGRectGetHeight(toolBar.frame);//44;
toolBar.frame = CGRectMake(x, y, w, h);
}
#if 0
LOG(@"back =%@", NSStringFromCGRect(viewBack.frame));
LOG(@"base =%@", NSStringFromCGRect(viewPicker.frame));
LOG(@"image =%@", NSStringFromCGRect(imageViewBlackGraBar.frame));
LOG(@"label =%@", NSStringFromCGRect(lblTitle.frame));
LOG(@"date =%@", NSStringFromCGRect(datePicker.frame));
LOG(@"time =%@", NSStringFromCGRect(timePicker.frame));
LOG(@"tool =%@", NSStringFromCGRect(toolBar.frame));
LOG(@"");
#endif
}
这是我在调查期间收集的额外信息。 下面是纵向和横向的.xib 。
尝试调用 [[self view] layoutIfNeeded]; 在调整大小视图中
或 [[self view] setNeedsLayout]; 当定向发生时。
如果您对系统在下一个即将到来的更新周期中更新它没问题,请使用 setNeedsLayout 如果您希望它立即更新,请使用 layoutIfNeeded。
您应该使用UITextField
而不是UILabel
并将日期选择器设置为 textField 的inputView
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.