如何创建一个包含自动滚动到顶部的 scrollView 的弹出窗口?
How can I create a popover which contains a scrollView automatically scrolled to the top?
我正在展示这样的弹出窗口:
let popoverContent = (self.storyboard?.instantiateViewController(withIdentifier: segueIdentifiers.informationPopover))! as UIViewController
let nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.popover
let popover = nav.popoverPresentationController
popoverContent.preferredContentSize = CGSize(width: 500,height: 600)
popover?.delegate = self
popover?.sourceView = self.view
popover?.sourceRect = CGRect(x: 0, y: 0, width: 100, height: 100)
self.present(nav, animated: true, completion: nil)
和
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return .none
}
正在创建的弹出窗口来自在 storyboard
中创建的 viewController
。
创建的 viewController
和 popover
具有以下布局。
--View
---Scroll View
----View
-----Text View
我最初遇到的问题是,容器顶部和 Text View
之间的 space 数量很尴尬。使用 this link 我看到我可以删除 Adjusts Scroll View Insets
。这修复了顶部问题的尴尬间距,但是当 scrollView
出现时,它仍然向下滚动三分之一,顶部的一些文本被隐藏。
问题:
scrollView
显示时向下滚动到三分之一处。
问题:
有没有办法使用 storyboard
将 scrollView
初始化为自动滚动到顶部,即 运行-time 属性?如果没有,我如何通过故事板 ID 以编程方式创建 popover
,我该如何以编程方式执行此操作?
更新 1
我尝试子类化我的 viewController
并为 scrollView
创建一个出口。在我的 viewDidLoad
、viewWillAppear
、viewDidLayoutSubviews
、viewDidAppear
和 viewWillLayoutSubviews
中,我尝试了以下代码。这并没有解决我的问题。
let scroll2TopOffset = CGPoint(x: 0, y: 0)
self.aboutUsScrollView.setContentOffset(scroll2TopOffset, animated: true)
解决方案:textView
需要在 viewDidLoad
中关闭滚动,然后在 viewDidAppear
中重新打开
class AboutUsViewController: UIViewController {
@IBOutlet weak var aboutUsTextView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
aboutUsTextView.isScrollEnabled = false
}
override func viewDidAppear(_ animated: Bool) {
aboutUsTextView.isScrollEnabled = true
}
}
将留下问题 - 想知道是否有更好的方法。
我正在展示这样的弹出窗口:
let popoverContent = (self.storyboard?.instantiateViewController(withIdentifier: segueIdentifiers.informationPopover))! as UIViewController
let nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.popover
let popover = nav.popoverPresentationController
popoverContent.preferredContentSize = CGSize(width: 500,height: 600)
popover?.delegate = self
popover?.sourceView = self.view
popover?.sourceRect = CGRect(x: 0, y: 0, width: 100, height: 100)
self.present(nav, animated: true, completion: nil)
和
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return .none
}
正在创建的弹出窗口来自在 storyboard
中创建的 viewController
。
创建的 viewController
和 popover
具有以下布局。
--View
---Scroll View
----View
-----Text View
我最初遇到的问题是,容器顶部和 Text View
之间的 space 数量很尴尬。使用 this link 我看到我可以删除 Adjusts Scroll View Insets
。这修复了顶部问题的尴尬间距,但是当 scrollView
出现时,它仍然向下滚动三分之一,顶部的一些文本被隐藏。
问题:
scrollView
显示时向下滚动到三分之一处。
问题:
有没有办法使用 storyboard
将 scrollView
初始化为自动滚动到顶部,即 运行-time 属性?如果没有,我如何通过故事板 ID 以编程方式创建 popover
,我该如何以编程方式执行此操作?
更新 1
我尝试子类化我的 viewController
并为 scrollView
创建一个出口。在我的 viewDidLoad
、viewWillAppear
、viewDidLayoutSubviews
、viewDidAppear
和 viewWillLayoutSubviews
中,我尝试了以下代码。这并没有解决我的问题。
let scroll2TopOffset = CGPoint(x: 0, y: 0)
self.aboutUsScrollView.setContentOffset(scroll2TopOffset, animated: true)
解决方案:textView
需要在 viewDidLoad
中关闭滚动,然后在 viewDidAppear
class AboutUsViewController: UIViewController {
@IBOutlet weak var aboutUsTextView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
aboutUsTextView.isScrollEnabled = false
}
override func viewDidAppear(_ animated: Bool) {
aboutUsTextView.isScrollEnabled = true
}
}
将留下问题 - 想知道是否有更好的方法。