Ios 使用自动布局、键盘插入和横向旋转配置UIScrollView内容

Ios 使用自动布局、键盘插入和横向旋转配置UIScrollView内容,ios,uiscrollview,autolayout,landscape,Ios,Uiscrollview,Autolayout,Landscape,我在autolayout(iOS 6,7)中使用ScrollView已经有一段时间了,现在越来越令人沮丧 考虑一个简单的输入表 我想要的是可滚动的,并且应该在横向中调整大小: 视图层次结构是: 我需要配置适当的约束,以便 当键盘出现和消失时,滚动区域得到正确更新 当设备旋转到横向和纵向时,内容的大小会随之调整 滚动区域得到相应的横向和纵向更新 这可以在没有代码的情况下完成吗? 我得到了什么 键盘出现时,滚动条大小错误 横向中未调整内容大小 要使用的源代码: 您的方法是可行的,值得改进

我在autolayout(iOS 6,7)中使用ScrollView已经有一段时间了,现在越来越令人沮丧

考虑一个简单的输入表 我想要的是可滚动的,并且应该在横向中调整大小:

视图层次结构是:

我需要配置适当的约束,以便
  • 当键盘出现和消失时,滚动区域得到正确更新
  • 当设备旋转到横向和纵向时,内容的大小会随之调整
  • 滚动区域得到相应的横向和纵向更新
这可以在没有代码的情况下完成吗? 我得到了什么 键盘出现时,滚动条大小错误

横向中未调整内容大小

要使用的源代码:

您的方法是可行的,值得改进,但如果您想要一种替代方法,请参见:

与其使用普通的UIScrollView,不如使用带有静态行的UITableView

在IB中,设计一个自定义静态表单元,其中包含一个UITextField作为子视图。布置好自定义静态表格单元后,将其复制并粘贴到表格视图中,直到有7个相同的自定义静态表格单元。然后将插座连接到每个文本字段

创建另一个自定义静态表格单元,将UIButton作为子视图。将插座连接到按钮上

带有静态单元格的表视图不需要任何表视图委托或数据源方法

使用表格视图而不是普通的滚动视图的好处是,具有第一响应者状态的文本字段在出现时会自动滚动到键盘上方。另一个好处是,您不必处理滚动视图的内容视图及其尺寸如何响应旋转

如果对场景使用表视图控制器,则表视图的默认约束将适当处理旋转。唯一需要处理的约束是布局表格单元子视图的约束


然而,如果你想坚持普通的滚动视图和自动布局,你可能想看看苹果的技术说明,如果你还没有:

看!经过两天的搜索,我相信我可能会找到答案。然而,不可否认,没有代码是无法实现的

首先创建从contentView到Scroll view的常用顶部、底部、前导和尾随约束。 但是,对于前导和尾随,请勾选“占位符-在构建时删除”选项

然后在viewDidLoad方法中添加以下内容:

NSLayoutConstraint *leftConstraint =[NSLayoutConstraint
                                     constraintWithItem:self.contentView
                                     attribute:NSLayoutAttributeLeading
                                     relatedBy:0
                                     toItem:self.view
                                     attribute:NSLayoutAttributeLeft
                                     multiplier:1.0
                                     constant:0];
[self.view addConstraint:leftConstraint];

NSLayoutConstraint *rightConstraint =[NSLayoutConstraint
                                     constraintWithItem:self.contentView
                                     attribute:NSLayoutAttributeTrailing
                                     relatedBy:0
                                     toItem:self.view
                                     attribute:NSLayoutAttributeRight
                                     multiplier:1.0
                                     constant:0];
[self.view addConstraint:rightConstraint];
这会将contentView中的前导和尾随约束动态添加到控制器的主视图(即,在滚动视图之外)

然后,当您旋转设备时,输入字段会适当拉伸。 这解决了您的旋转问题,关于键盘的外观,有其他答案,但基本上在viewDidLoad中:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardDidHideNotification object:nil];
然后添加以下两种方法:

- (void) keyboardWasShown:(NSNotification *)notification
{
  NSDictionary *info = [notification userInfo];
  CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
  UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0);
  self.scrollView.contentInset = contentInsets;
  self.scrollView.scrollIndicatorInsets = contentInsets;
}

- (void) keyboardWillBeHidden:(NSNotification *)notification
{
  UIEdgeInsets contentInsets = UIEdgeInsetsZero;
  self.scrollView.contentInset = contentInsets;
  self.scrollView.scrollIndicatorInsets = contentInsets;
}

我认为不需要编写代码,只使用IB就可以满足您的需求

您只需将约束直接从contentView添加到viewController的self.view

要绕过IB的限制,仅向superview(在本例中为scrollView)添加约束,只需按Ctrl键并将contentView拖动到self.view即可

像这样:


使用AutoLayout将UITextFields放入底部带有UIButton的UIScrollView中


您是否接受重构视图层次结构的想法?当然。只要它满足要求。@paiv你应该看看这段视频,那里显示了一个与你非常相似的案例:youtube.com/watch?v=pgenprbrb18他专注于struts和strings布局,我无法将其应用到我的案例中。在最后一分钟,他谈到了autolayout的不同之处,但这没有帮助。我希望他能下载源代码。是否还有带有自动布局的contentView?如果视图的内容较少,不应该以纵向方向滚动,而是在键盘出现时滚动,或者旋转到横向方向,该怎么办?我甚至无法在旋转时调整字段的大小。如果设备旋转,您可以尝试保留高度和宽度约束的引用,并更新其常量。我已经阅读了技术说明,但仍然无法理解我的情况。现在我将继续使用表视图控制器,因为它们为我做这些事情,但我真的很想了解它们在这方面的内部结构。滚动视图更通用,我想使用它们,而不是表格。有趣的占位符发现,很高兴知道。非常感谢。我目前正在努力解决contentView和scrollview底部之间的底部空间问题。在我的示例中,在纵向视图中不应滚动,但在横向视图中应垂直滚动。好的,这对我有帮助:我需要将contentView和scrollView之间的底部约束设置为零。感谢上帝的回答!但为什么有必要呢?为什么UIScrollView从定义其子视图高度的约束中正确推断出其contentSize.height,而不是contentSize.width?这种解决方案可行,但不知何故,只有屏幕的左侧部分(可能对应于纵向模式下的宽度)处理滚动,而屏幕的右侧部分是“死的”。以前有人经历过吗?如果是,如何修复?除了添加约束以将contentView的左/右绑定到外部视图外,您还可以在Interface Builder中将contentView和主视图的宽度设置为相等。见: