iphone – UIView加载了Nib autoresizing问题

我有一个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,则应首先释放现有对象.

点赞