【问题标题】:Best approach: Swipe between scrollable views or view controllers最佳方法:在可滚动视图或视图控制器之间滑动
【发布时间】:2017-10-06 02:30:27
【问题描述】:

我的应用中有几个屏幕看起来像这样(不是来自我的应用,是在网上找到的):

其中一个是实际的介绍屏幕,就像上面的那个,另一个会在最后一个视图上显示一些数据和一个“我同意”按钮。

在所有情况下,用户都必须在视图/视图控制器之间滑动。

我知道我可以像这样在视图控制器之间滑动:Setting up UIScrollView to swipe between 3 view controllers,我也可以使用它在视图之间滑动:

func respondToSwipeGesture(_ gesture: UIGestureRecognizer)
{
    print("respondToSwipeGesture")

    if let swipeGesture = gesture as? UISwipeGestureRecognizer
    {
        switch swipeGesture.direction
        {
            case UISwipeGestureRecognizerDirection.right:
                    if(isLeftToRightActive == true)
                    {
                        print("Swiped right")
                        moveTheMainView()
                    }
            case UISwipeGestureRecognizerDirection.left:
                    if(isLeftToRightActive == false)
                    {
                        print("Swiped left")
                        moveTheMainView()
                    }
            default:
                break
        }
    }
}

func moveTheMainView()
{
    print("moveTheMainView")

    let mainViewContainerHeight = self.vMainViewContainer.frame.height
    let mainViewContainerWidth = self.vMainViewContainer.frame.width

    let mainViewContainerModifiedLeft : CGFloat = mainViewContainerWidth / 2


    if(isLeftToRightActive == false)
    {
        print("Move the main view to the right")

        let urlCRTable = Bundle.main.url(forResource: "CRCharts", withExtension: "html")
        let crTableRequestObj = URLRequest(url: urlCRTable!)
        self.wvCRTable.loadRequest(crTableRequestObj)

        ivIndicator.image = UIImage(named: "SecondOn")


        isLeftToRightActive = true
    }
    else
    {
        print("Move the main view to the left")

        let urlCRTable = Bundle.main.url(forResource: "CRTable", withExtension: "html")
        let crTableRequestObj = URLRequest(url: urlCRTable!)
        self.wvCRTable.loadRequest(crTableRequestObj)

        ivIndicator.image = UIImage(named: "FirstOn")

        isLeftToRightActive = false
    }
}

所以我想知道最好/正确的方法是什么:使用多个视图控制器或在同一个视图控制器中使用多个视图?或者有没有其他被认为是正确的方式?

【问题讨论】:

标签: ios swift uiview uiviewcontroller


【解决方案1】:

我通常使用 PageViewController 进行这样的演练。您应该在屏幕截图上创建这样的场景。和类:

class WalkthroughContentViewController: UIViewController {

@IBOutlet var headingLabel: UILabel!
@IBOutlet var contentLabel: UILabel!
@IBOutlet var contentImageView: UIImageView!
@IBOutlet var pageControl: UIPageControl!
@IBOutlet var forwardButton: UIButton!

var index = 0
var heading = ""
var imageFile = ""
var content = ""

override func viewDidLoad() {
    super.viewDidLoad()

    headingLabel.text = heading
    contentLabel.text = content
    contentImageView.image = UIImage(named: imageFile)
    pageControl.currentPage = index

    switch index {
    case 0...1: forwardButton.setTitle("NEXT", for: .normal)
    case 2: forwardButton.setTitle("DONE", for: .normal)
    default: break
    }

}
@IBAction func nextButtonTapped(sender: UIButton) {

    switch index {
    case 0...1: // Next Button
        let pageViewController = parent as! WalkthroughPageViewController
        pageViewController.forward(index: index)

    case 2: // Done Button
        UserDefaults.standard.set(true, forKey: "hasViewedWalkthrough")

        // Add Quick Actions
        if traitCollection.forceTouchCapability == UIForceTouchCapability.available {
            let bundleIdentifier = Bundle.main.bundleIdentifier
            let shortcutItem1 = UIApplicationShortcutItem(type: "\(bundleIdentifier).OpenFavorites", localizedTitle: "Show Favorites", localizedSubtitle: nil, icon: UIApplicationShortcutIcon(templateImageName: "favorite-shortcut"), userInfo: nil)
            let shortcutItem2 = UIApplicationShortcutItem(type: "\(bundleIdentifier).OpenDiscover", localizedTitle: "Discover Restaurants", localizedSubtitle: nil, icon: UIApplicationShortcutIcon(templateImageName: "discover-shortcut"), userInfo: nil)
            let shortcutItem3 = UIApplicationShortcutItem(type: "\(bundleIdentifier).NewRestaurant", localizedTitle: "New Restaurant", localizedSubtitle: nil, icon: UIApplicationShortcutIcon(type: .add), userInfo: nil)
            UIApplication.shared.shortcutItems = [shortcutItem1, shortcutItem2, shortcutItem3]
        }

        dismiss(animated: true, completion: nil)

    default: break

    }
}
}

class WalkthroughPageViewController: UIPageViewController, UIPageViewControllerDataSource {

var pageHeadings = ["Personalize", "Locate", "Discover"]
var pageImages = ["foodpin-intro-1", "foodpin-intro-2", "foodpin-intro-3"]
var pageContent = ["Pin your favorite restaurants and create your own food guide",
                   "Search and locate your favourite restaurant on Maps",
                   "Find restaurants pinned by your friends and other foodies around the world"]

override func viewDidLoad() {
    super.viewDidLoad()

    // Set the data source to itself
    dataSource = self

    // Create the first walkthrough screen
    if let startingViewController = contentViewController(at: 0) {
        setViewControllers([startingViewController], direction: .forward, animated: true, completion: nil)
    }
}

// MARK: - UIPageViewControllerDataSource Methods

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {

    var index = (viewController as! WalkthroughContentViewController).index
    index -= 1

    return contentViewController(at: index)
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {

    var index = (viewController as! WalkthroughContentViewController).index
    index += 1

    return contentViewController(at: index)
}

// MARK: - Helper Methods

func contentViewController(at index: Int) -> WalkthroughContentViewController? {
    if index < 0 || index >= pageHeadings.count {
        return nil
    }

    // Create a new view controller and pass suitable data.
    if let pageContentViewController = storyboard?.instantiateViewController(withIdentifier: "WalkthroughContentViewController") as? WalkthroughContentViewController {

        pageContentViewController.imageFile = pageImages[index]
        pageContentViewController.heading = pageHeadings[index]
        pageContentViewController.content = pageContent[index]
        pageContentViewController.index = index

        return pageContentViewController
    }

    return nil
}

func forward(index: Int) {
    if let nextViewController = contentViewController(at: index + 1) {
        setViewControllers([nextViewController], direction: .forward, animated: true, completion: nil)
    }
}

}

【讨论】:

  • 谢谢,我会尽快看看 PageViewController。
【解决方案2】:

如果您有更多项目,则应使用 UICollectionView,每个项目(图像中带有红色背景)将是一个单元格。 这样视图将被重用,性能更好。

【讨论】:

  • 感谢您的建议,这是一个有趣的方法。
【解决方案3】:

你应该使用 UIPageViewController 这个方法。

如何使用检查:https://stackoverflow.com/a/25416608/3901620

Third Library for this

【讨论】:

  • 谢谢,我试试看。我以前从未使用过它,所以我什至不知道它是一个实际的控制器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多