我按照本教程创建了一个类似Snapchat的菜单: https://www.youtube.com/watch?v=1_daE3IL_1s
简而言之,我们的想法是使用 XIB 创建自定义视图,并将它们添加到滚动视图中。
我想在其中一个自定义视图中添加一个"后退"按钮,以便在点击该按钮时滚动视图将自动滚动回其初始视图。我的想法是在自定义视图的 IBAction 函数中编写一个代码来调用 UIScrollview 的内容偏移委托函数。
以下是视图控制器中的代码:
class ViewController: UIViewController, UIScrollViewDelegate {
//I'm naming the Scroll View as "scrollView"
@IBOutlet weak var scrollView: UIScrollView! {
didSet{
scrollView.delegate = self
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
var v1 : View1 = View1(nibName: "View1", bundle: nil)
var v2 : View2 = View2(nibName: "View2", bundle: nil)
self.addChild(v1)
self.scrollView.addSubview(v1.view)
v1.didMove(toParent: self)
self.addChild(v2)
self.scrollView.addSubview(v2.view)
v1.didMove(toParent: self)
var v2Frame : CGRect = v2.view.frame
v2Frame.origin.x = self.view.frame.width
v2.view.frame = v2Frame
self.scrollView.contentSize = CGSize(width: self.view.frame.width * 2, height: self.view.frame.height)
// self.scrollView.contentSize = CGSize(self.view.frame.width * 2, self.view.frame.size.height)
}
}
以下是视图 2 中的代码:
class View2: UIViewController {
@IBOutlet weak var buttonHome: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func buttonHomeAction(_ sender: Any) {
//how to access scrollview.setContentOffset from ViewController to scroll the view back to the first view?
}
所以我的问题是如何从 ViewController 访问 scrollview.setContentOffset 以将视图滚动回第一个视图?我走在正确的轨道上吗?或者是否有其他方法可以点击按钮并将视图滚动回其第一页?
谢谢!
我可以在这里想到两个不错的选择:
1)在scrollView
View2
中保持弱引用。在View2
中添加:
weak var scrollView: UIScrollView?
并在ViewController
中,view2
创建后添加:
view2.scrollView = self.scrollView
现在,在buttonHomeAction
中,您将可以访问滚动视图。
2) 如果您熟悉 Apple 的委派模式,则可以添加一个委托,这可能是表示视图控制器的弱引用。
为委托创建一个协议,使用命名的视图保存委托。 因此,在这种情况下:View2Delegate
并添加描述操作的方法。
protocol View2Delegate: AnyObject {
func buttonTapped()
}
因此,在View2
中添加:
weak var delegate: View2Delegate?
在ViewController
中,view2
创建后添加:
view2.delegate = self
现在,在ViewController
实现协议方法并访问 scrollView:
extension ViewController: View2Delegate {
func buttonTapped() {
// access scrollView as self.scrollView
}
}