【问题标题】:Create a standalone view in storyboard to use programmatically在情节提要中创建独立视图以编程方式使用
【发布时间】:2012-12-17 20:29:44
【问题描述】:

我正在尝试使用情节提要创建和设计UIView,但以编程方式将其包含在UIActionSheet 中。这基本上是为了避免使用带有像素的CoreGraphics定位函数

在旧的 xcode 中,我记得可以在没有任何控制器的情况下将 UIView 拖到笔尖上。

视图显然必须连接到类,所以它会有一个 IBOutlet,但不会被添加到 self.view

让我觉得这应该是可能的一件事是,如果您将 UIView 拖到情节提要中的控制器黑条中,它会像这样弹出:

但它没有显示在屏幕上。这个功能有什么用?我可以以某种方式打开这个视图并设计一下吗?

【问题讨论】:

标签: objective-c ios xcode uistoryboard


【解决方案1】:

只需创建一个新的 .xib 文件。

  1. 右键单击导航器区域中的某处并选择“新建文件...”。
  2. 从右侧列表中选择“用户界面”,然后选择“视图”。
  3. 点击“下一步”、“下一步”,为您的新视图命名,然后“创建”。
  4. 一个新的 .xib 填充将添加到您的项目中。
  5. 双击新的 .xib 文件,它会在 Interface Builder(不是 Storyboard)中打开。
  6. 根据自己的喜好编辑/设计视图。

然后,在 Interface Builder 中拥有新视图 (.xib) 后,只需创建 UIView 的新子类 (ex.MyView),切换新视图的类 ( .xib) 到 MyView,在您的控制器中创建 MyView 的实例,并将其作为子视图添加到您的其他视图。


*为了回答您关于底部那个小黑条的问题,它被称为“Dock”,它只是顶层的迷你表示你的场景的文件。该扩展坞便于快速将图标拖放到上面并建立连接。请参阅苹果的故事板描述here。 Ray Wenderlich 有一个易于理解的故事板教程here

【讨论】:

  • 我创建的 xib 视图不符合我给它的界限。它只是将其显示为填充整个屏幕frame = (0 0; 320 302);。你知道我是否需要对 xib 做一些特别的事情来设置一些“固定”的界限吗?
  • @YarekT 是的,将“Size”下拉菜单设置为“Simulated Metrics”下的“Freeform”。您可以在 Xcode Utility Area 的检查器窗格中的第 4 个选项卡(标尺图标左侧)下找到它。
  • 我已经有了那套。设置原点并没有改变任何东西。视图 大小正确,但其框架和边界设置为全屏大小:i.imgur.com/IGQeE.png(顶部导航栏不是 xib UIView 的一部分)
  • @YarekT 你是如何设置你的 bounds 属性的?
  • xib UIView 的边界应该通过 Storyboard 设置:i.imgur.com/oYuo0.png 紫色轮廓是边界。编辑器 > 画布 > 显示边界矩形
【解决方案2】:

故事板上的UIViewController 之外不能有UIView。我猜这是因为故事板不知道如何识别或实例化当前的 API。这是我自己用过的东西。解决方案是对UIView 使用 XIB 并以编程方式加载它(就像以前一样)。我发现对大多数项目使用情节提要,并将 XIB 用于跨多个视图控制器的可重用视图确实可以很好地协同工作。

这是我用来加载 XIB 作为自定义对象的一部分的一些代码,该对象被初始化。

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        [[[NSBundle mainBundle] loadNibNamed:@"BannerView" owner:self options:nil] objectAtIndex:0];
        [self addSubview:self.view];
        self.frame = self.view.frame;
    }
    return self;
}

至于将视图拖到故事板上的黑条中。这些视图仍然是UIViewController 的一部分,但它们不是顶级视图的“子视图”。我认为文档大纲很好地显示了层次结构。

以下视图在我的主视图层次结构之外有 2.1.1 视图、2.1.2 视图等,因为它们不是我的主视图的子视图。结果是,默认情况下它们不会显示。我确实有IBOutlets 设置,我有条件地使用标准addSubview:removeFromSuperview 从我的主视图层次结构中添加/删除它们。

【讨论】:

  • 那么是否有可能创建一个完全设计的子视图,带有按钮、标签等,然后将其拖到栏并使其成为顶级视图,以编程方式进行切换?编辑:答案似乎是否定的,表格视图控制器不喜欢没有UITableView =/我认为故事板 UI 仍然需要一些工作
  • 我没有尝试过,但它可能会导致更复杂的视图控制器出现问题。我倾向于将它用于通常对用户不可见的叠加层。它从我的故事板上消除了隐藏对象的混乱,并且可能通过将它们远离主视图来加速视图(微不足道),除非需要。
  • @Eric 因为 Storyboard 不允许您在没有 UIViewController 的情况下创建 UIView。我想如果它让我将视图拖到停靠栏而不是子视图中,那么我可以以编程方式将它连接到 UIActionSheet。正如您正确指出的那样,解决方案是仅使用视图创建一个单独的 xib
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多