菜鸟教程小白 发表于 2022-12-11 18:42:39

ios - 如何将一个 UIViewController 作为屏幕的一部分


                                            <p><p>我需要一个 UIPageViewController 来在屏幕顶部制作我的图像的幻灯片...我认为一个很好的例子是 Airbnb 应用程序,当您选择房子时,您将被推送到顶部包含的 ViewController PageViewController 中的图像数组(我认为)</p>

<p>我不得不说我有一个由 collectionView 提供支持的应用程序,我希望它出现在我的顶部 UICollectionViewCell...</p>

<p>我还发现了一些关于使用容器的信息,但我不知道如何添加...</p>

<p>还有一点是我不使用 StoryBoard ...</p>

<pre><code>import UIKit

class ImageCell: UICollectionViewCell {
    override init(frame: CGRect) {
      super.init(frame: frame)
      setupView()    }

    required init?(coder aDecoder: NSCoder) {
      fatalError(&#34;init(coder:) has not been implemented&#34;)
    }

    let imageView : UIImageView = {
      let image = UIImageView()
      image.image = #imageLiteral(resourceName: &#34;Apple_Watch_Main&#34;)
      image.translatesAutoresizingMaskIntoConstraints = false
      return image
    }()

    func setupView() {
      backgroundColor = .black
      addSubview(imageView)
      addConstraints(NSLayoutConstraint.constraints(withVisualFormat: &#34;H:||&#34;, options: NSLayoutFormatOptions(), metrics: nil, views: [&#34;v0&#34; : imageView]))

      addConstraints(NSLayoutConstraint.constraints(withVisualFormat: &#34;V:||&#34;, options: NSLayoutFormatOptions(), metrics: nil, views: [&#34;v0&#34; : imageView]))
    }
}
</code></pre>

<p>这是我要添加 UIPageViewController 的单元格</p>

<p>我找到了答案</p>

<p>我做了一个这样的类(class)</p>

<pre><code>class PageViewController: UIPageViewController , UIPageViewControllerDataSource{
    override func viewDidLoad() {
      super.viewDidLoad()

      dataSource = self
      let frameViewController = FrameViewController()
      frameViewController.imageName = imageNames.first

      let viewControllers =
      setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)
    }

    let imageNames = [&#34;Apple_Watch_Main&#34; , &#34;Pic2&#34; , &#34;Pic3&#34;]

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -&gt; UIViewController? {

      let currentImageName = (viewController as! FrameViewController).imageName
      let currentIndex = imageNames.index(of: currentImageName!)
      if currentIndex! &gt; 0 {
            let frameViewController = FrameViewController()
            frameViewController.imageName = imageNames
            return frameViewController
      }
      return nil
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -&gt; UIViewController? {

      let currentImageName = (viewController as! FrameViewController).imageName
      let currentIndex = imageNames.index(of: currentImageName!)
      if currentIndex! &lt; imageNames.count - 1 {
            let frameViewController = FrameViewController()
            frameViewController.imageName = imageNames
            return frameViewController
      }
      return nil
    }
}
</code></pre>

<p>在我的 Collection View 中,我将我的第一个单元格完全为空,所以它就像一个窗口,然后我将 subviewController 和页面 Controller 的 View 添加到该单元格,现在它工作得很好</p>

<p>这是代码</p>

<pre><code>override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -&gt; UICollectionViewCell {

      switch indexPath.item {
      case 0 :
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as!ImageCell

            let pagecontroller = PageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
            self.addChildViewController(pagecontroller)

            cell.addSubview(pagecontroller.view)

            pagecontroller.view.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height/3)
            return cell
      case 1 :
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: &#34;filterandorganize&#34;, for: indexPath) as! FilterAndOrganize
            return cell
      case 2 :
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: &#34;Offers&#34;, for: indexPath) as! Offers
            return cell
      case 3 :
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: &#34;OfferedProducts&#34;, for: indexPath) as! OfferedProducts
            cell.firstViewController = self
            return cell
      default:
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: &#34;Offers&#34;, for: indexPath) as! Offers
            return cell
      }
    }
</code></pre>

<p>你看到的情况是 0(我的第一个单元格)我添加了它</p>

<p>效果很好</p>

<p> <a href="/image/V4psQ.jpg" rel="noreferrer noopener nofollow"><img src="/image/V4psQ.jpg" alt="this is the view"/></a> </p>

<p> <a href="/image/aN62n.png" rel="noreferrer noopener nofollow"><img src="/image/aN62n.png" alt="this is the view when you scroll "/></a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我把答案写成编辑,效果很好</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何将一个 UIViewController 作为屏幕的一部分,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/46262112/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/46262112/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何将一个 UIViewController 作为屏幕的一部分