在屏幕外绘制 uiview

Posted

技术标签:

【中文标题】在屏幕外绘制 uiview【英文标题】:drawing a uiview offscreen 【发布时间】:2014-02-15 04:33:33 【问题描述】:

我想创建一个在调用 ViewDidLoad 时不在屏幕上的 UIView,但是一旦调用了某个函数,我就会在屏幕上设置动画。动画 UIView 的代码很好,但我似乎无法在屏幕外绘制 UIView(我已将情节提要中的 UIView 组装到我的 UIViewControleller 上)。这是我尝试过的代码:

- (void)viewDidLoad 

    ...

     [_tagView setFrame:CGRectMake(0, self.view.frame.size.height+40, self.view.frame.size.width, 40)];

    ...


_tagView 绘制在我放置在 StoryBoard 编辑器中的位置,它位于我的 UIViewController 的底部。

【问题讨论】:

在 ViewDidLoad 中添加 _tagView 到 self.view.. 的子视图 【参考方案1】:

有几件事:视图对象的框架在其父视图的坐标空间中给出了它的坐标。

视图的边界是它的内部坐标系。

当你设置一个视图的框架时,它应该用它的父级边界来表示,而不是它的父级框架。

因此,您的代码应该根据 self.view.bounds 而不是 self.view.frame 创建 _tagView 的框架。

接下来,您使用的是 AutoLayout 还是 struts 和 springs?在 Xcode 5 中,一切都默认为 AutoLayout。当 AutoLayout 处于活动状态时,您无法更改框架和边界。相反,您必须更改相关约束。如果您想手动设置视图的框架,您可能需要关闭 AutoLayout 并使用“struts and springs”样式的视图几何图形。

已编辑:为了清楚起见,我将 cmets 中的一些信息移到了我的原始答案中:

如果你想在运行时移动一个自动布局激活的视图,你必须找到你想改变的设置的约束,(宽度、高度、前缘、后缘等)并控制拖动约束到您的 .h 文件中以创建一个出口。然后在您的代码中更改与约束关联的常量属性。 – 邓肯 C 22 分钟前

请注意,您可以逐个故事板或逐个 NIB 关闭自动布局。如果您选择文件并选择文件检查器,则会在“Interface Builder Document”部分隐藏一个复选框“Use Autolayout”。我总是很难找到它。

这是一个屏幕截图,显示了 Xcode 项目窗口中按钮的位置(最右侧)

【讨论】:

谢谢,这是非常有用的信息。我使用的是 Xcode (5.0.2) 的最新版本,所以我使用的是 AutoLayout。那么我想将情节提要中的视图 y coor 设置为视图框架+40 吗?此外,即使我使用 AutoLayout,我的一些子视图也无法在 iPhone 4 上正确绘制。这是将值硬编码到 IB 中而不是使用绑定的结果吗? AutoLayout 非常混乱。在 AutoLayout 中,视图在 IB 中的放置实际上几乎没有任何意义。在运行时,系统会查看视图上的约束并根据这些约束移动/调整它们的大小。如果您尝试更改视图的框架,约束通常会将其更改回来,而没有明显的效果。您想在 IB 中设置约束,然后转到 Editor 菜单,选择“Resolve Auto Layout Issues”和“Update Frames”。这将使您的视图四处移动,以根据您当前的限制显示它们应该在哪里。 如果你想在运行时移动一个自动布局激活的视图,你必须找到你想改变的设置的约束,(宽度、高度、前缘、后缘等)并从约束中控制拖动到您的 .h 文件中以创建一个出口。然后在您的代码中更改与约束关联的常量属性。 请注意,您可以逐个故事板或逐个 NIB 关闭自动布局。如果您选择文件并选择文件检查器,则会在“Interface Builder Document”部分隐藏一个复选框“Use Autolayout”。我总是很难找到它。如果找不到,请告诉我,我会发布一个屏幕截图链接。 这非常有用。非常感谢

以上是关于在屏幕外绘制 uiview的主要内容,如果未能解决你的问题,请参考以下文章

iOS进阶--UIView的绘制

在uiview上绘制随机设计

在 UIScrollView 下方绘制阴影(滚动 UIView)

理解UIView的绘制-孙亚洲

在 ViewController 之外的 UIScrollView 内绘制/布置宽 UIView 的内容

如何在Objective C中只绘制UIView的顶角而不是整个视图?