【问题标题】:Programmatically resize a UIViewController based on its container以编程方式根据其容器调整 UIViewController 的大小
【发布时间】:2010-12-22 15:13:53
【问题描述】:

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

我想在不同的地方重用这个 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 等),但似乎没有什么适用于所有情况。

【问题讨论】:

    标签: iphone uiviewcontroller uiwebview uinavigationcontroller uitabbarcontroller


    【解决方案1】:

    如果您不使用 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 的边界。

    【讨论】:

    • 感谢您的快速回复,达伦。两种选择都解决了这个问题。但是,有一点我不明白。为什么我不能在我的代码示例中使用 self.view.frame 作为 webViewFrame? self.view.frame 不应该在 viewDidLoad 中具有正确的大小吗?
    • self.view 在 vi​​ewDidLoad 之后调整大小。事实上,它可以出于多种原因随时调整大小(例如,正在调用的标题栏)。因此,您必须始终设置您的 autoresizingMask,以便正确调整子视图的大小。
    • 有趣。那么在viewDidLoad中其实根本没有办法知道self.view的实际frame,那么呢?
    • 似乎调整大小已经发生过一次 -(void)viewDidLayoutSubviews 被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多