以编程方式基于其容器调整UIViewController的大小

时间:2009-12-02 23:13:04

标签: iphone uiviewcontroller uiwebview uinavigationcontroller uitabbarcontroller

我有一个简单的UIViewController,只有一个UIWebView。 UIWebView应占用所有可用空间来显示网址的内容。

我想在各个地方重用这个ViewController。在某些情况下,它将被推送到NavigationController,在某些情况下它将显示为ModalViewController。有时它可能在TabBarController中。 UIWebView的大小因具体情况而异。

在不使用Interface Builder的情况下设置UIWebView框架的最佳方法是什么?换句话说,我应该如何在以下代码中初始化webViewFrame?或者还有其他我想念的东西?

- (void)viewDidLoad {
    [super viewDidLoad];
    UIWebView* webView = [[UIWebView alloc] initWithFrame:webViewFrame];
    webView.delegate = self;
    NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    [webView loadRequest:request];
    [self.view addSubview:webView];
    [webView release];
}

我尝试了不同的可能性(self.view.frame,self.navigationController.view.frame等),但似乎没有任何东西适用于所有情况。

1 个答案:

答案 0 :(得分:8)

如果您没有使用NIB,那么您的-loadView方法是什么样的?它应该是这样的:

- (void)loadView
{
    UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    webView.delegate = self;
    self.view = webView
    [webView release];
}

在这种情况下,初始帧是无关紧要的。 UIViewController将负责正确调整视图大小。

但是,如果您确实要将Web视图(或任何其他视图)插入父视图,则可以使用autoresizeMask来控制视图如何使用其父视图调整大小。

例如:

    UIView* parentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 200)];
    parentView.autoresizesSubviews = YES;

    UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    [parentView addSubview:webView];
    self.view = parentView;
    [parentView release];

在这种情况下,webView的初始帧相对于parentView的边界。