UIScrollView奇怪的行为与UITextField/UIPickerView

问题描述:

所以我现在很困惑,因为我的UIScrollView行事很奇怪。UIScrollView奇怪的行为与UITextField/UIPickerView

基本上,我有一个UIScrollView约为iPhone 6的高度的两倍,我使用它来显示一些使用iOS图表的图形,所以我将它设置为能够垂直滚动和弹跳,但不能滚动也不水平反弹。所有的图形,以及一些额外的UITextFields和UILabel都嵌入在一个单独的“主体视图”中,该主体视图与UIScrollView的框架对齐,这似乎是常见做法。因此,我的观点的层次结构是这样的:

hierarchy

这个工作很好,直到今天我注意到,当我按下这个UIScrollView的一个特定的UITextField,这将触发一个UIPickerView,所有的突然我的滚动视图开始允许水平弹跳。当它们被轻敲时,对于正文视图上的两个其他UITextField,则不会发生此行为。

我已经检查了所有通过点击受影响的文本字段触发的代码,并且没有任何内容直接编辑任何UI对象的框架或边界。实际上,当文本字段被点击时调用的唯一函数是textFieldDidBeginEditing。我已经附上了这个函数的代码,但我相当确定它不是问题。

我的下一个怀疑是UIPickerView弹出已经搞乱我的滚动视图和/或它的嵌入式视图的尺寸。我不太确定这是否可能/可能,但整件事情让我非常难过。

这里是我的代码:

func textFieldDidBeginEditing(_ textField: UITextField) { 

    if textField == overallTimeframeTextField { 
     ... 
     // Not the problematic text field 
    } else if textField == subjectTimeframeTextField { 
     ... 
     // Also not the problematic text field 
    } else { // Affected text field 

     // Set the text of the text field 
     if textField.text == "" { 
      // This is executed in this scenario 
      textField.text = subjectPickerData[0] 
     } else { 
      ... 
     } 
    } 
} 

下面是一个简短概述GIF我的问题。你可以看到我向下滚动页面,在那里我无法水平反弹,然后一旦我在文本字段上标记,突然滚动视图允许反弹。

GIF

我几乎失去了这个问题,所以任何帮助,将不胜感激。

编辑

为了澄清,我明确地声明我的滚动视图的内容大小等于想要的高度,使用户在屏幕的宽度。然后我设置bodyView的宽度等于相同的值。

// Fit the content to the screen 
scrollView.contentSize = CGSize(width: UIScreen.main.bounds.width, height: 1200) 
bodyView.frame.size.width = UIScreen.main.bounds.width 

我也有强制滚动视图和身体既着眼于具有相同的宽度为UIViewController的默认子视图(滚动视图在我的层次中的父约束:这是viewDidAppear用下面的代码完成)。

我注意到一个有趣的事情是,当我打印我的滚动视图的宽度和我的身体视图时的意见负载,我收到了iPhone 6以下的输出:

385.0

385.0

这是正确的,因为这是iPhone 6的宽度。然而,当我点击的文本字段,然后打印相同的价值观,我得到这样的输出:

385.0

384.0

所以,出于某种原因,我的身体的看法是一个点比我的滚动视图小。当我点击文本字段时,我尝试将身体视图的宽度设置为等于滚动视图,就像我在viewDidAppear函数中那样,但这没有效果。

在UIPickerView而言,我初始化pickerview我的类的实例变量,像这样:

var subjectPickerView = UIPickerView() 

我然后分配这个选择器视图是文本字段中输入视图中viewDidLoad

textField.inputView = subjectPickerView 

所以我不知道这是否使得选择器视图的滚动视图的子视图,但它只是在这种情况下更换键盘。

+0

是您的滚动视图反弹垂直启用? – CodeChanger

+0

@CodeChanger是的,“反弹”和“垂直反弹”已启用,“水平反弹”未启用。 –

+0

*“我已将它设置为...既不滚动又不水平反弹”*滚动的能力基于contentSize--您是明确设置还是使用约束?你说*“UITextField ---触发一个UIPickerView”*你如何显示选择器视图?它是滚动视图的子视图吗? – DonMag

感谢@ AchmadJP的评论,我试着在我的滚动视图和我的身体视图之间明确地创建一个等宽的约束。这似乎解决了这个问题。

我之前没做过这个事情的原因是,身体视图的前导空间,尾随空间,顶部空间和底部空间被限制为与滚动视图相同。从理论上讲,这应该意味着宽度在任何时候都是相等的,但显然情况并非如此。

对于有同样问题的其他人,您可以看到this answer的解决方案。