【问题标题】:Creating UIViewController's with subview programmatically [duplicate]以编程方式创建带有子视图的 UIViewController [重复]
【发布时间】:2014-07-04 07:34:58
【问题描述】:

我想以编程方式创建一个将 UIWebView 作为子视图的控制器。我设法用以下代码做到这一点:

VLUpdateViewController.h

@interface VLUpdateViewController : UIViewController

@property (nonatomic, strong) UIWebView* webView;

@end

VLUpdateViewController.m

@implementation VLUpdateViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.view setBackgroundColor:[UIColor blueColor]];
    [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
    self.webView = [[UIWebView alloc] initWithFrame:self.view.frame];
    [self.webView setBackgroundColor:[UIColor redColor]];
    [self.webView setScalesPageToFit:YES];
    [self.view addSubview:self.webView];

    NSArray* constraints = [[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[webView]-0-|" options:0 metrics:nil views:@{@"webView" : self.webView}] arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[webView]-0-|" options:0 metrics:nil views:@{@"webView" : self.webView}]];

    [self.view addConstraints:constraints];
}

但是,我的问题是当方向改变时 webView 没有正确调整大小。事实上,它根本不会调整大小。它只是在屏幕的中心旋转。

肖像:

风景:

我尝试省略setTranslatesAutoresizingMaskIntoConstraints:,但是当我将方向更改为横向时,我得到了以下结果。

【问题讨论】:

  • 当方向改变时你需要更新 UIWebview 的框架。并更新约束。
  • 我在情节提要上做的时候没有问题,并且该问题的正确答案对我不起作用。
  • @YogeshSuthar 我该怎么做?
  • @halileohalilei 检查stackoverflow.com/a/4301828/1679187
  • 你们为什么把它标记为重复?您甚至看过建议的答案吗?这不是这个问题的答案!这个要求采用程序化方法。

标签: ios objective-c uiwebview


【解决方案1】:

我复制并粘贴了您的代码,并添加了缺少的行:

self.webView.translatesAutoresizingMaskIntoConstraints = NO;

你的 self.view 有 translatesAutoresizingMaskIntoConstraints = NO,但你的 self.webView 没有。

最终代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self.view setBackgroundColor:[UIColor blueColor]];
    [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
    self.webView = [[UIWebView alloc] initWithFrame:self.view.frame];
    [self.webView setBackgroundColor:[UIColor redColor]];
    [self.webView setScalesPageToFit:YES];



    // ---------------------------------------
    // this line is missing
    // ---------------------------------------
    self.webView.translatesAutoresizingMaskIntoConstraints = NO;



    [self.view addSubview:self.webView];

    NSArray* constraints = [[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[webView]-0-|" options:0 metrics:nil views:@{@"webView" : self.webView}] arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[webView]-0-|" options:0 metrics:nil views:@{@"webView" : self.webView}]];

    [self.view addConstraints:constraints];

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com/"]];

    [self.webView loadRequest:request];
}

【讨论】:

  • 当我这样做时,我只得到一个黑屏并且网页没有加载。
  • 那么还有其他干扰,那是您粘贴的真实代码吗?似乎您正在使用自定义视图控制器,也许您的视图控制器的视图没有立即加载。在这种情况下,请尝试延迟您的约束设置和网页加载,直到视图出现之后。看看有没有帮助。
  • 我正在从另一个 UIVIewController 创建这个控制器,并以presentViewController:animated:completion: 模态显示它。这可能是问题所在?
【解决方案2】:

使用自动布局最简单的方法是Masonry..而不是编写多行代码,这将使工作完成得非常完美。

添加 Masonry 框架(最好是 pod)并导入类。 并使用这段代码: // 下面这行声明 webview 在任何状态下都应该与 superview 具有相同的大小

[self.webView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(superview);
}];

如果你想有一些填充:

UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

    [self.webView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(superview.mas_top).with.offset(padding.top); 
        make.left.equalTo(superview.mas_left).with.offset(padding.left);
        make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
        make.right.equalTo(superview.mas_right).with.offset(-padding.right);
    }];

瞧……就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2011-09-20
    • 2017-10-30
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多