【问题标题】:Size a UIView created from a xib?调整从 xib 创建的 UIView 的大小?
【发布时间】:2014-12-01 21:59:40
【问题描述】:

我正在从 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 的大小,以使内部约束能够正确调整大小和呈现?

【问题讨论】:

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

标签: ios uiview autolayout xib


【解决方案1】:

尝试设置所需的视图框架,然后在其上调用 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。我会试试的。
猜你喜欢
  • 2018-07-09
  • 1970-01-01
  • 2023-03-16
  • 2012-02-23
  • 2015-11-17
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多