如何调整UIView的大小并强制其子视图调整大小

时间:2013-07-10 06:03:31

标签: objective-c uiview uiscrollview

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

我希望保持UIView's垂直尺寸并调整其水平尺寸以匹配UIScrollView的尺寸,后者会根据设备的方向而改变。请注意,这全部放在UISplitViewController的详细信息视图中。

因此,用户必须垂直滚动而不是水平滚动,因为UIView上的所有文本字段都应调整大小以适合水平放置在屏幕上。

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

我自动调整了UIViewUIScrollView上设置的子视图。

有关该怎么做的任何提示?如果设备方向发生变化,我还会在哪里放置代码来调整UIView的大小?

其他信息。

我在IB中创建UIView作为与包含DetailViewController的{​​{1}}相同的NIB中的单独视图。因为它比UIScrollView高得多,我在IB中创建它的唯一方法是将它设置为所需宽度和高度的单独视图。然后,我创建了一个IBOutlet,并将此视图作为子视图添加到UIScrollView方法中的UIScrollView。除了viewDidLoad子视图未横向调整大小外,这一切似乎都可以找到所有正确显示的视图。

关于我在这里做错了什么的任何建议?

2 个答案:

答案 0 :(得分:3)

由于您没有直接从xib将视图放在scrollview中,因此IB不提供选项来提供与superview有关的约束。您可能必须以编程方式添加约束。请参阅here

修改

另请尝试在视图上使用以下内容(未尝试过,应根据documentation工作,但不确定自动布局):

self.view.autoresizesSubviews = YES;

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

答案 1 :(得分:3)

在发现更多之后确定我认为我找到了正确的方法来做我想做的事情,所以我想我应该留下一个关于此的说明。请记住,我正在尝试创建一个可滚动的窗体,它可以调整宽度,但不能调整其高度,因此用户只需向上和向下滚动即可访问字段。

  1. 要创建需要在设备上滚动的大型固定大小表单,请确保在IB中将ViewController大小设置为Freeform。然后,您可以将视图创建为IB中所需的任何大小,并且在运行时它将调整为设备大小。
  2. 在主视图中放置UIScrollView(我称之为scrollView)并将其左右和上下固定(即使用IB设置约束)
  3. 在scrollView中放置一个UIView(我称之为contentView),并使其与scrollView的大小相同,并将其四面拼接到其superview(scrollView)
  4. 现在添加contentView所需的所有标签和文本字段,并确保从上到下和从左到右添加垂直约束,以便autolayout可以计算出宽度和高度,以便计算scrollView.contentSize < / LI>
  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中子视图的约束优先级设置为低于1,000,您也可以采用相同的方式垂直调整大小。如果您不希望它小于特定大小,请将大于或等于大小设置为高优先级。

  10. 如果有人能够弄清楚如何设置contentView,使其仅使用IB约束来调整其宽度以匹配scrollView,我很想知道如何。