我有一个UIView子类 –
@interface DatePickerPopup : UIView
UIToolbar *toolbar;
UIDatePicker *datePicker;
@end
@implementation
- (id)initWithFrame:(CGRect)frame
{
NSArray *xib =
[[NSBundle mainBundle]
loadNibNamed:@"DatePickerPopup"
owner:self
options:nil];
self = [xib objectAtIndex:0];
if (self) {
}
return self;
}
@end
和笔尖看起来像 –
在我的包含DatePickerPopup(datePopup)的UIViewController中:
- (void)viewDidLoad
{
datePopup = [[DatePickerPopup alloc] initWithRect:CGRectZero];
CGRect newFrame = datePopup.frame;
newFrame.y = 200.0f; //lets say this aligns it to the bottom in portrait
datePopup.frame = newFrame;
// Normally happens when accessory button pressed but for brevity...
[self.view.superview addSubview:datePopup];
}
- (void)willAnimateRotationToInterfaceOrientation:
(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
{
CGRect screen = [[UIScreen mainScreen] bounds];
if (toInterfaceOrientation == UIInterfaceOrientationPortrait ||
toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
{
self.datePopup.frame =
CGRectMake(0.0f, newHeightPortrait, screen.size.width, 260.0f);
}
else
{
self.datePopup.frame =
CGRectMake(0.0f, newHeightLandscape, screen.size.width, 260.0f);
}
}
然而,当方向改变视图被拉伸到屏幕边界的高度时,由于某种原因,这会被拉伸 – 导航栏……
在viewDidLoad之后
在willAutorotate之后……
最佳答案 由于您的视图控制器似乎由导航控制器管理,因此调用[self.view.superview addSubview:datePopup];将您的弹出窗口添加为UIViewControllerWrapperView的子视图,UIViewControllerWrapperView是UIKit用于实现UINavigationController功能的私有类之一.与UIKit的私有视图层次结构混淆总是有风险的.在这种情况下,根据您所看到的行为,UIKit似乎希望UIViewControllerWrapperView的任何子视图都是视图控制器的视图,因此它会相应地调整弹出窗口的大小.
我认为解决此问题最安全的方法是让视图控制器的视图成为包含tableView的包装器,并在必要时包含弹出视图.不幸的是,使用包装器视图意味着视图控制器不能是UITableViewController.您必须将超类更改为UIViewController,设置自定义tableView属性,并手动采用UITableViewDataSource和UITableViewDelegate协议.
注意:您可能想要将popover添加为窗口的子视图,但我不建议这样做,因为UIWindow仅自动旋转其对应于视图控制器的最顶层子视图.这意味着如果您将弹出窗口添加到窗口,它将不会自动旋转.
编辑:BTW,通过重新分配self = [xib objectAtIndex:0];在initWithFrame:中,你正在泄漏最初分配的对象.如果您要以这种方式重新分配self,则应首先释放现有对象.