3

我有UIScrollView一个UIView作为子视图的。UIView有一堆垂直排列的数据输入字段——本质上只是一个固定格式的数据输入表单。

我想保持UIView's垂直尺寸并调整其水平尺寸以匹配UIScrollView根据设备方向变化的尺寸。请注意,这都放置在 Detail 视图中UISplitViewController

所以用户必须垂直滚动而不是水平滚动,因为所有文本字段都UIView应该调整自己的大小以适应屏幕水平。

目前,如果我UIView通过更改框架宽度以匹配框架宽度来调整大小,UIScrollView'sUIView子视图(文本字段)不会根据 IB 中的约束设置调整自身大小。UIView只是似乎被剪掉了。没有水平滚动,因此这方面工作正常。

我设置了自动调整大小的子UIView视图UIScrollView

关于在这里做什么的任何提示?UIView另外,如果设备方向发生变化,我会在哪里放置代码来调整大小?

附加信息。

我将UIViewin IB 创建为与DetailViewController包含UIScrollView. 因为它比UIScrollView我在 IB 中创建它的唯一方法要高得多,如果我将它设置为所需宽度和高度的单独视图。然后我创建一个 IBOutlet 并将这个视图作为子视图添加到UIScrollView方法中viewDidLoad。这一切似乎都适用于所有正确显示的视图,除了UIView子视图没有水平调整大小。

关于我在这里可能做错的任何建议?

4

2 回答 2

3

由于您使用的是不直接从 xib 将视图放入滚动视图中,因此 IB 不提供选项来提供与超级视图有关的约束。您可能必须以编程方式添加约束。请参见此处

编辑:

还可以尝试在视图上使用以下内容(没有尝试过,应该根据文档工作,但不确定是否使用自动布局):

self.view.autoresizesSubviews = YES;

或者,如果您根本不想使用自动布局,那么在尺寸检查器中将视图设置为展开(水平/垂直)的早期方法就可以了。为此,您必须禁用自动布局。选择 xib-> 文件检查器 -> 取消选中自动布局复选框

于 2013-07-10T06:55:34.960 回答
3

好的,经过更多的发现,我认为我已经找到了正确的方法来做我想做的事情,所以我想我应该就此留下一个便条。请记住,我正在尝试创建一个可滚动的表单,该表单调整其宽度而不是其高度,因此用户只需上下滚动即可访问字段。

  1. 要创建需要在设备上滚动的固定大小的大型表单,请确保在 IB 中将 ViewController 大小设置为 Freeform。然后,您可以在 IB 中将视图创建为您想要的任何大小,并在运行时将其调整为设备大小。
  2. 将UIScrollView(我称之为scrollView)放在主视图中,左右上下固定(即使用IB设置约束)
  3. 在scrollView中放置一个UIView(我称之为contentView)并使其与scrollView的大小相同,并将其固定在其超级视图(scrollView)的所有侧面
  4. 现在将所有需要的标签和文本字段添加到 contentView 并确保从上到下和从左到右添加垂直约束,以便自动布局可以计算出宽度和高度以计算 scrollView.contentSize
  5. 将 contentView 宽度约束设置为固定大小,使其在 IB 中看起来合理。请记住,我们希望 contentView 的宽度始终与 scrollView 宽度相匹配,这样用户就不必横向滚动,只需上下滚动即可。我们将在运行时在代码中设置适当的宽度,因为我还没有在 IB 中找到任何这样做的方法。也许在约束上设置优先级可能会实现这一点,但我认为 UIScrollView 不会为你做这件事。
  6. 现在在 ViewController.h 文件中添加一个属性,并将其连接到您在上面 5) 中创建的 contentView 宽度约束。

    @property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewWidth;
    
  7. 最后在 ViewController 中创建一个 viewDidLayoutSubviews 方法,并添加如下代码设置 contentView 宽度与 scrollView 宽度相同。

    - (void)viewDidLayoutSubviews
    {
        self.contentViewWidth.constant = self.scrollView.frame.size.width;
    
        [self.view layoutSubviews];
    }
    
  8. 如果事情没有正确调整大小,请检查您的所有约束是否设置正确。IB似乎做了一些我觉得很奇怪的事情。但最后我让它与似乎是最低限度的编码一起工作。

  9. 只要在 contentView 中将 subview 的约束优先级设置为低于 1000,也可以垂直调整大小。如果您不希望它小于某个大小,也可以设置大于或等于大小的高优先级。

如果有人能弄清楚如何设置 contentView 以便它调整其宽度以匹配仅使用 IB 约束的滚动视图,我很想知道如何。

于 2013-07-12T02:01:21.780 回答