从xib创建的UIView如何调整大小?

4

我正在使用xib创建一个UIView,最终要将其呈现为UIImage。

这个UIView本身具有内部约束,在IB中给定足够大的框架大小可以正常工作。然而,我需要将宽度调整到某些特定内容,并且我无法弄清楚如何在从xib加载后设置UIView的宽度。

[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil][0];

要呈现视图,我这样做:

UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

无论我将边界设置为什么,UIView的大小都与IB中的初始大小相同。我该如何设置UIView的大小,以便导致内部约束正确调整大小并呈现?

如果您正在使用自动布局,您可能需要添加一个约束来指定新的宽度(如果有现有的宽度约束,则需要删除该约束)。如果您使用布局约束,则直接设置框架并不总是有效。 - Greg
我尝试以编程方式设置宽度约束,但也没有成功。 - Stefan Kendall
UIView在框架更改后延迟其内部更新到下一个运行循环中,这可能是可能的吗?我以前遇到过这样的问题,将后续渲染代码包装在主线程上的dispatch_async通常可以解决它(但是,以编程方式设置宽度约束对我来说也总是有效的,因此您可能有其他原因导致问题)。 - Greg
1个回答

7
尝试设置视图的所需帧,并在其上调用layoutIfNeeded:
UIView *view = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil][0];
CGRect finalFrame = CGRectMake(0, 0, 90, 90);
view.frame = finalFrame;
[view layoutIfNeeded];

UIGraphicsBeginImageContextWithOptions(finalFrame.size, NO, 0.0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

我没有尝试过layoutIfNeeded。我会尝试一下。 - Stefan Kendall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接