iOS Swift:如何实现类似用户界面的堆叠卡片?

Posted

技术标签:

【中文标题】iOS Swift:如何实现类似用户界面的堆叠卡片?【英文标题】:iOS Swift: How to achieve stack of cards like user interface? 【发布时间】:2017-10-25 07:15:52 【问题描述】:

我正在尝试实现以下设计,其中四个不同的视图控制器将背靠背堆叠。下面的参考图片 -

每个视图控制器都会动态地拥有包含不同数据的表视图。可以通过从右侧滑动来切换视图控制器。

我知道 UIPageViewController 适合这种分页方式。 但是,这种堆叠的页面浏览量恐怕能实现吗?

我还没有开始任何事情,我需要一些想法才能开始。首先,是否有可能做到这一点?

如果不够清楚,请告诉我。谢谢。

【问题讨论】:

是否和:***.com/questions/43530231/…一样? 我建议创建一个容器视图控制器并向其中添加子视图控制器。 好的@AuRis。但是,如何使用容器视图将页面显示在彼此之上? 核心动画和仿射变换应该可以做到这一点。 好的有用的信息。但是如果您可以发布一些代码sn-ps会有所帮助吗? 【参考方案1】:

正如我在评论中所建议的,您可以创建一个容器视图控制器,在其中添加您的子视图控制器。您如何呈现和删除它们取决于您。我添加了滑动手势以将它们从childViewControllers 数组中逐个删除,但您可以使用动画等进行详细说明。示例如下:

import UIKit
class ViewController: UIViewController 
    override func viewDidLoad() 
        super.viewDidLoad()

        let swipeGesturRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(didSwipe))
        swipeGesturRecognizer.direction = .left
        view.addGestureRecognizer(swipeGesturRecognizer)

        var index = 0
        let amount = 5
        while index < amount 
            let childViewController = UIViewController()
            childViewController.view
            .translatesAutoresizingMaskIntoConstraints = true
            let hue = 1.0 / CGFloat(index)
            childViewController.view.backgroundColor = UIColor(hue: hue, saturation: 0.5, brightness: 0.5, alpha: 1)
            childViewController.view.frame = self.view.bounds.insetBy(dx: CGFloat(amount - index) * 10, dy: 80.0).offsetBy(dx: 0.0, dy: -CGFloat(amount - index) * 10.0)
            childViewController.view.layer.borderColor = UIColor.blue.cgColor
            childViewController.view.layer.borderWidth = 1.0
            self.view.addSubview(childViewController.view)
            self.addChildViewController(childViewController)
            childViewController.didMove(toParentViewController: self)
            index += 1
        
    

    // Removes child view controlelrs one by one when swiped left
    @objc func didSwipe() 
        guard let childViewController = childViewControllers.last else 
            return
        
        childViewController.willMove(toParentViewController: nil)
        childViewController.view.removeFromSuperview()
        childViewController.removeFromParentViewController()
    

【讨论】:

我会试试这个,让你知道。非常感谢 如果我想修改它以创建一个无限循环(而不是在滑动时删除子视图,将其推送到最后一个索引),我该怎么办?有什么提示吗?

以上是关于iOS Swift:如何实现类似用户界面的堆叠卡片?的主要内容,如果未能解决你的问题,请参考以下文章

使用Koloda View在Swift中构建类似Tinder(国内的探探社交应用)的卡片

IOS Swift3卡栈覆盖

如何在 swift 中创建像 tinder 这样的堆栈视图? [关闭]

如何将引导卡从水平堆叠到垂直以使其响应?

Swift:如何确保没有无限的 ViewController 堆叠在一起(如果需要,如何关闭它们)? [复制]

Swift:如何确保没有无限的ViewController堆叠在一起(如果需要,如何解除它们)? [重复]