Прокрутите вид прокрутки при нажатии кнопки Swift с кодом просмотра

#ios #swift #iphone

Вопрос:

Я создаю ViewPager в Swift, используя ViewCode. Мне нужно создать следующее действие: нажмите на кнопку «Далее» (метод: actionNextPressed () ) и прокрутите представление прокрутки до следующей страницы (например, прокрутка ленты вправо или влево). Вот мой быстрый код, то, что я пробовал до сих пор, и экран печати с видоискателя (на данный момент)

введите описание изображения здесь

PagerViewController.swift

 import UIKit import SnapKit  open class PagerViewController: UIViewController, UIPageViewControllerDelegate {  private lazy var dimmedView: UIView = {  let view = UIView()  view.backgroundColor = .black  view.alpha = maxDimmedAlpha  return view  }()    private lazy var containerView: UIView = {  let view = UIView()  view.backgroundColor = UIColor(white: 1, alpha: 0)  return view  }()    lazy var scrollView: UIScrollView = {  let scrollView = UIScrollView()  scrollView.showsHorizontalScrollIndicator = false  scrollView.isPagingEnabled = true  scrollView.contentSize = CGSize(width: view.frame.width * CGFloat(pages.count), height: containerView.frame.height)    for i in 0..lt;pages.count {  var page = pages[i]  let dialog = PageViewController(  icon: page.icon,  titleText: page.title,  descriptionText: page.description,  titleActionButton: page.titleButton,  actionButton: page.actionButton  )!  scrollView.addSubview(dialog.view)  scrollView.subviews[i].frame = CGRect(  x: view.frame.width * CGFloat(i),  y: 0,  width: containerView.frame.width,  height: containerView.frame.height  )  }    scrollView.delegate = self  return scrollView  }()    lazy var pageControl: UIPageControl = {  let pageControl = UIPageControl()  pageControl.currentPage = 0  pageControl.numberOfPages = pages.count  pageControl.addTarget(self, action: #selector(pageControlTapHandler(sender:)), for: .allEvents)  pageControl.isUserInteractionEnabled = false  pageControl.pageIndicatorTintColor = .systemGray  pageControl.currentPageIndicatorTintColor = .systemBlue  pageControl.backgroundColor = .white  return pageControl  }()    private lazy var directionsButtonsStackView: UIStackView = {  let view = UIStackView()  view.axis = .horizontal  view.distribution = .fillEqually  view.backgroundColor = .red  return view  }()    private lazy var buttonJump = UIButton()  private lazy var buttonBefore = UIButton()  private lazy var buttonNext = UIButton()  private var titleJumpButton: String! = ""  private let maxDimmedAlpha: CGFloat = 0.6  open var pages: Arraylt;PageModelgt;!  private var currentPage: Int = 0    init?(listPages: Arraylt;PageModelgt;, titleJumpButton: String) {  super.init(nibName: nil, bundle: nil)  self.pages = listPages  self.titleJumpButton = titleJumpButton  }    required public init?(coder: NSCoder) {  fatalError("init(coder:) has not been implemented")  }    @objc func pageControlTapHandler(sender: UIPageControl) {  scrollView.scrollTo(horizontalPage: sender.currentPage)  }    open override func viewDidLoad() {  super.viewDidLoad()  setupView()  addViewComponents()  setupConstraints()  }    private func setupView() {  self.buttonJump = PageButton(frame: .zero).build(  context: self,  title: titleJumpButton!,  selector: #selector(actionJumpPressed)  )    self.buttonBefore = PageButton(frame: .zero).build(  context: self,  title: "Before",  selector: #selector(actionBeforePressed)  )  self.buttonBefore.backgroundColor = .white    self.buttonNext = PageButton(frame: .zero).build(  context: self,  title: "Next",  selector: #selector(actionNextPressed)  )    self.buttonJump.setTitle(titleJumpButton, for: .normal)  }    private func addViewComponents() {  view.addSubview(dimmedView)    containerView.addSubview(scrollView)    containerView.addSubview(pageControl)    directionsButtonsStackView.addArrangedSubview(buttonBefore)  directionsButtonsStackView.addArrangedSubview(buttonNext)  containerView.addSubview(directionsButtonsStackView)    containerView.addSubview(buttonJump)    view.addSubview(containerView)  }    private func setupConstraints() {  dimmedView.snp.makeConstraints { make in  make.top.equalToSuperview()  make.bottom.equalToSuperview()  make.leading.equalToSuperview()  make.trailing.equalToSuperview()  }    containerView.snp.makeConstraints { make in  make.top.equalToSuperview().offset(100)  make.bottom.equalToSuperview().inset(100)  make.leading.equalToSuperview()  make.trailing.equalToSuperview()  make.centerX.equalToSuperview()  make.centerY.equalToSuperview()  make.margins.equalTo(20)  }    scrollView.snp.makeConstraints { make in  make.top.equalToSuperview()  make.bottom.equalTo(pageControl.snp.top)  make.leading.equalTo(containerView.snp.leading)  make.trailing.equalTo(containerView.snp.trailing)  }    pageControl.snp.makeConstraints { make in  make.bottom.equalTo(directionsButtonsStackView.snp.top)  make.leading.equalTo(containerView.snp.leading).offset(20)  make.trailing.equalTo(containerView.snp.trailing).inset(20)  make.height.equalTo(30)  make.centerX.equalToSuperview()  }    directionsButtonsStackView.snp.makeConstraints { make in  make.bottom.equalTo(buttonJump.snp.top)  make.leading.equalTo(containerView.snp.leading).offset(20)  make.trailing.equalTo(containerView.snp.trailing).inset(20)  make.height.equalTo(60)  make.width.greaterThanOrEqualTo(0)  make.centerX.equalToSuperview()  }    buttonJump.snp.makeConstraints { make in  make.bottom.equalToSuperview().inset(10)  make.leading.equalTo(containerView).offset(20)  make.trailing.equalTo(containerView).inset(20)  make.centerX.equalToSuperview()  make.width.greaterThanOrEqualTo(0)  make.height.equalTo(50)  }  }    @objc private func actionJumpPressed() {  self.dismiss(animated: true, completion: nil)  }    @objc private func actionBeforePressed() {  if currentPage == 0 {  return  } else {  currentPage -= 1  pageControl.currentPage = currentPage  }  }    @objc private func actionNextPressed() {  if currentPage == pages.count {  return  } else {  currentPage  = 1  pageControl.currentPage = currentPage  }  } }  extension PagerViewController: UIScrollViewDelegate {  public func scrollViewDidScroll(_ scrollView: UIScrollView) {  let pageIndex = Int(round(scrollView.contentOffset.x / view.frame.width))  pageControl.currentPage = pageIndex  currentPage = pageIndex  } }  extension UIScrollView {  func scrollTo(horizontalPage: Int? = 0) {  var frame: CGRect = self.frame  frame.origin.x = frame.size.width * CGFloat(horizontalPage ?? 0)  self.scrollRectToVisible(frame, animated: true)  } }  

Комментарии:

1. Я думаю, что ваш код отменяет сам себя: внутри scrollViewDidScroll у вас есть логика, которая может отменить то, что делается внутри actionNextPressed . Вам нужно различать, если это свайп , сделанный пользователем, затем используйте логику внутри scrollViewDidScroll , а если это нажатие кнопки, то используйте ТОЛЬКО логику внутри actionNextPressed .

Ответ №1:

Однажды у меня была такая же проблема с коллекционным представлением. Вы должны выключить .isPagingEnabled, прокрутите представление прокрутки в нужном месте и включите его обратно на подкачку.

 func scrollTo(horizontalPage: Int? = 0) {  scrollView.isPagingEnabled = false  var frame: CGRect = self.frame  frame.origin.x = frame.size.width * CGFloat(horizontalPage ?? 0)  self.scrollRectToVisible(frame, animated: true)  scrollView.isPagingEnabled = true  }