【问题标题】:IOS Swift beginner [closed]IOS Swift初学者[关闭]
【发布时间】:2023-05-11 07:10:02
【问题描述】:

在一个屏幕视图-滚动视图-内容视图中,内容视图中有很多文本字段,所以我使用滚动视图将它们放在一个屏幕中。现在的问题是我无法单击或输入文本字段,因为我知道滚动视图已经覆盖了内容视图。但我想输入文本字段并能够滚动屏幕。我试图在这里看到很多答案,但无法找出正确的解决方案。 滚动视图和内容视图都启用了用户交互,在滚动视图中打开/关闭“延迟内容触摸”/“可取消内容触摸”但不起作用。 感谢任何帮助。

【问题讨论】:

  • 文本字段是否放置在滚动视图上?
  • 您应该将文本字段放在滚动视图中,而不是内容视图中。
  • 如果我放入scrollview,如何滚动?

标签: ios swift uiscrollview swift2


【解决方案1】:

只需在 viewDidLoad 上创建两个通知(一次在键盘出现时,另一次在键盘消失时):

  //Notifications for keyBoard when appears.
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillShow), name:UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillHide), name:UIKeyboardWillHideNotification, object:  nil)

然后调用计算填充的函数并进行滚动。

func keyboardWillShow(notification:NSNotification){
        var userInfo = notification.userInfo!
        var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue()
        keyboardFrame = self.view.convertRect(keyboardFrame, fromView: nil)

        var contentInset:UIEdgeInsets = self.scrollview.contentInset
        contentInset.bottom = keyboardFrame.size.height
        self.scrollview.contentInset = contentInset
}

func keyboardWillHide(notification:NSNotification){
        var contentInset:UIEdgeInsets = UIEdgeInsetsZero
        self.scrollview.contentInset = contentInset
}

【讨论】:

  • 嗨,我试过上面的代码,但还是不行。我还需要执行其他步骤吗?
  • 你创建了scrollView的outlet并在self.scrollview改名了吗?我已经编辑了答案,看看通知的新结构。
  • 我握住控件并将滚动视图拉到 .swift 连接到@IBOutlet 弱变量滚动视图:UIScrollView!并且把self.scrollview改成self.scrollView,对吗?
  • 是的,没错
  • 哦,现在可以了!!!非常感谢!!!
【解决方案2】:

点击文本框时使用 TPKeyboardAvoiding 自动管理滚动。

https://github.com/michaeltyson/TPKeyboardAvoiding

制作 TPKeyboardAvoidingScrollView 对象并将文本字段添加到此滚动视图中,这样它就可以正常工作了。

在情节提要中,在身份检查器中使用类名“TPKeyboardAvoidingScrollView”并将其绑定以正常工作。

【讨论】:

  • 嗨,我下载了它并将文件 TPKeyboardAvoiding 放入我的项目中。还将滚动视图类设置为 TPKeyboardAvoidingScrollView。但它仍然不起作用,并收到警告“Interface Builder 文件中的未知类 TPKeyboardAvoidingScrollView”。我还需要执行其他步骤吗?
  • 需要在bridge文件中导入。
  • 对不起,我是初学者,请告诉我如何将它导入到桥文件中?