【问题标题】:Don't know the final frame size of UIView until after drawRect?直到drawRect之后才知道UIView的最终帧大小?
【发布时间】:2012-04-03 20:41:40
【问题描述】:

我正在使用drawRect 在 UIView 中绘制数据网格,在创建 UIView 时我不知道最终大小,因为列数和行数是动态的。当然,我可以在创建 UIView 之前进行计算,但这并没有什么意义,因为我也会在 UIView 子类中进行这些计算,而不必提取它。

那么我该如何处理呢?我是否用一个非常大的框架初始化并在 drawRect 完成后对其进行调整?

我还将将此视图设置为 UIScrollView 的内容,以防它太大而无法在分配给它的区域中查看。

我要绘制的视图如下所示:

【问题讨论】:

标签: ios core-graphics


【解决方案1】:

也许其他人有另一种解决方案,但我认为在您的情况下,我会覆盖 setFrame: 并调用 setNeedsDisplay 以便在您的框架更改后调用 drawRect。您是否已经尝试过这种方法?

【讨论】:

  • 嗯.. 这似乎有点 hacky。我会稍等一下,看看还有什么其他建议。谢谢!
  • 也许...但我相信您希望它更像 layoutSubviews 一样工作,每次框架更改时都会调用它。只有当某些东西特别要求它重新绘制视图时才会调用drawRect。
  • 另外一件事,您是使用 init 还是 initWithFrame: 来初始化您的自定义 UIView?
  • 我还没有使用。当我不知道我的框架开始时,我对如何处理它感到困惑。
  • 啊,好吧,如果您在实例化时根本不知道视图的框架,我仍然认为您唯一的选择是从覆盖的 setFrame: 调用 setNeedsDisplay: 或者从父级调用它视图控制器的 layoutSubviews 方法(不推荐)。否则我很想看看其他人的建议!
【解决方案2】:
  • 在视图中添加一个方法,根据其数据确定它的大小。这需要与drawRect: 分开。
  • 在您的视图控制器中,当您设置视图时,调用该方法以获取该大小。
  • 然后将视图的边界和/或框架设置为该大小。
  • 并将滚动视图的contentSize 设置为该大小。

关键概念是:将“确定我的视图的东西有多大”和“绘制我的视图的东西”的想法分开。现在,您正在绘制时进行尺寸计算,但您需要能够更早地进行。

如果您想变得花哨,可以考虑在视图的超级视图中覆盖 layoutSubviews - 这是检查视图所需大小是否已更改的好地方,然后更新视图的大小和滚动视图的contentSize。但没有必要这样做才能开始。

【讨论】:

  • 我只是想到了同样的事情,但你确认它让我认为它是正确的。 :) 谢谢!
  • layoutSubviews 被多次调用。见:stackoverflow.com/a/20131528/143225
  • 是的,您确实需要在 -layoutSubviews 中小心,并且仅在需要时才进行工作。这就是为什么我说“检查视图的所需大小是否已更改”。如果 -layoutSubviews 再次被调用,但没有任何改变,那么你不需要做任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多