【问题标题】:iOS auto layout coordinates and programmatically drawing viewsiOS 自动布局坐标和以编程方式绘制视图
【发布时间】:2016-05-13 06:11:38
【问题描述】:

我在情节提要中有一个受限于自动布局的视图。我想绘制一个核心图形元素并将其添加到部分重叠视图。问题是定位。在 viewdidlayoutsubviews 完成之前,情节提要视图不会获得最终大小。

如果我尝试在 viewdidlayoutsubviews 方法中绘制重叠元素,viewdidlayoutsubviews 将被再次调用并无限循环。如果我在 viewDidAppear 方法中添加重叠元素,它确实可以正常工作。 viewDidAppear 的问题是元素绘制到屏幕上有半秒的延迟。我希望它与屏幕的其余部分同时绘制和出现。

我有一些关于如何进行的想法

  1. 在不可见的情况下在另一个线程上绘制元素,然后在布局完成后将其移动到所需位置并使其可见。

  2. 从情节提要中删除元素并以编程方式制作所有元素。

  3. 在 viewDidLoad 方法中创建具有自动布局的元素,并让自动布局系统定位它。 (不太确定我会怎么做)

从我所在的位置到屏幕同时绘制所有元素的最佳推荐方法是什么?

【问题讨论】:

  • 您是否尝试过在 viewWillAppear 中这样做?另一种选择,虽然不太优雅,是设置一个标志,并在第一次之后将其设置为 false,因此它只执行一次绘图。
  • “我想绘制一个核心图形元素”:核心图形绘制到一个上下文中。提供上下文的是什么?您是在创建CGImage 还是UIImage?您是否在 drawRect: 的视图中绘图?还有什么?
  • 上下文来自我 viewDidLoad 中的一个 cgrect。我正在用 drawRect 方法绘制它。
  • viewWillAppear 出现在 viewdidlayoutsubviews 之前,给我一个不正确的元素位置。

标签: ios swift autolayout


【解决方案1】:

如何从 viewDidLayoutSubviews 调用一次 GC 元素的 setNeedsDisplay()(或任何你绘制它的方式)

你可以像这样使用 GCD 的 dispatch_once:

var token : dispatch_once_t = 0
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    dispatch_once(&token, { () -> Void in
        cgthing.setNeedsDisplay()
    })        ...
}

【讨论】:

  • 这确实有效。不确定它是否比布尔控制标志更好。感谢您的帮助!
猜你喜欢
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多