2014-10-07 73 views
3

我从xib创建一个UIView,最终呈现为UIImage。大小一个从xib创建的UIView?

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的大小,以便它会导致内部约束来调整大小并正确呈现?

+0

如果您使用自动布局,你可能需要添加一个约束来指定新的宽度(和删除现有的宽度约束如果有的话)。如果使用布局约束,直接设置框架并不总是可行。 – Greg 2014-10-07 13:02:15

+0

我尝试以编程方式设置宽度约束,并且也不成功。 – 2014-10-07 13:09:10

+0

在更改帧到下一个运行循环后,有可能'UIView'延迟它的内部更新吗?之前我遇到过这个问题,并且将后续的渲染代码包装在主线程的'dispatch_async'中通常会修复它(但是之后,以编程方式设置宽度约束条件也总是对我有用,所以你可能会有其他的东西导致问题)。 – Greg 2014-10-07 13:14:39

回答

6

尝试设置视图的所需的帧,然后调用它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(); 
+0

我没有尝试layoutIfNeeded。我会尝试的。 – 2014-10-07 15:27:00

+0

这绝对有效。 – 2014-10-07 17:42:16

相关问题