如何在将 UIView 制作成图像之前正确布局

Posted

技术标签:

【中文标题】如何在将 UIView 制作成图像之前正确布局【英文标题】:How to get UIView to layout properly before making it into an image 【发布时间】:2013-06-01 12:02:07 【问题描述】:

我正在使用此代码将 UIView 渲染为图像

-(UIImage *)getImageForView:(UIView *)aView      
UIGraphicsBeginImageContextWithOptions(aView.bounds.size, NO, 0.0);
[aView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return viewImage;

我遇到的问题是视图没有使用自动布局正确设置。我该怎么办。

我目前创建了一个 UIView“viewA”,其框架的大小适合我的视图,然后创建复杂的预期视图“ViewB”(具有自动布局),然后将 viewB 作为子视图添加到“viewA”然后我将 viewA 提供给我的上述方法。

首先,我认为 viewA 不必添加到某些超级视图,但它的布局不正确,我是否应该将 alpha 为 0 的 viewA 添加到超级视图,然后我假设可能可以使用“layoutIfNeeded”但打开我应该这样做哪个视图?

编辑:这是创建 UIView 的代码

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 439)];

//This is the UIView that contains a lot of views
MyView *myView = [[MyView alloc] init];

myView.translatesAutoresizingMaskIntoConstraints = NO;

[view addSubview:myView];

[view addConstraints:[NSLayoutConstraint
                      constraintsWithVisualFormat:@"V:[myView(439)]"
                      options:0
                      metrics:nil
                      views:NSDictionaryOfVariableBindings(myView)]];

[view addConstraints:[NSLayoutConstraint
                      constraintsWithVisualFormat:@"H:[myView(320)]"
                      options:0
                      metrics:nil
                      views:NSDictionaryOfVariableBindings(myView)]];

最后对我有用的东西

[myView layoutIfNeeded];
[view layoutIfNeeded];

换句话说,在两个视图上都调用它。

【问题讨论】:

显示视图创建和添加子视图的代码。你在设置框架吗? 完成。期待您的想法。 尝试:MyView *myView = [[MyView alloc] initWithFrame: view.bounds]; 【参考方案1】:

在您的图像上下文中渲染它之前,向您的视图发送layoutIfNeeded 消息。

【讨论】:

我打算自己回答这个问题,但你说得非常对。看来我需要在两个视图上都调用它。首先在 myView 上,然后在另一个视图上。然后它会正确布局。

以上是关于如何在将 UIView 制作成图像之前正确布局的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nib 中为 UIView 应用自动布局?

UIView 无法在具有自动布局的 UIScrollView 中正确居中

如何正确制作标签项填充?

iOS - 如何在将单元格动态插入 UICollectionView 之前正确重新加载单元格

使用自动布局时如何将动画从一个 UIView 翻转到另一个?

如何制作一个可以覆盖导航栏的UIView?