在仅在最后一个 UIImageview 上可见的 PageViewController 上添加 UIButton

Adding UIButton on PageViewController which is visible on the last UIImageview only

我完成了一个基于送餐的项目 app.I 添加了我的 3 张图像,它们位于视图控制器及其页面视图控制器中,因为我希望我的图像水平滑动。

我问这个问题的主要目的是我需要在最后一张图片中有一个按钮 view.Please 为我提供添加仅在最后一张图片中可见的 UIButton 的完整代码。 例如 - :

(Lets Go) 是一个按钮,在关于按钮放置的最后一张图片 view.Forget 中可用。

提前致谢....

我的代码是这样的-:

ViewController.swift

导入 UIKit

class ViewController: UIViewController , UIPageViewControllerDataSource{

var pageViewController : UIPageViewController?
let Contentimages = ["splash","up","viewpage_bg"]


override func viewDidLoad() {
    
   super.viewDidLoad()
    
   createpageViewController()
   setupPageControl()
    
}

override func didReceiveMemoryWarning() {
    
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func createpageViewController(){

let pageController = self.storyboard?.instantiateViewController(withIdentifier: "pageController") as! UIPageViewController
    pageController.dataSource = self
    if Contentimages.count > 0 {
    
        let  firstController = getItemController(0)!
        let startingViewController = [firstController]
    
    
         pageController.setViewControllers(startingViewController, direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil)
    }
        

    pageViewController = pageController
    addChildViewController(pageViewController!)
    self.view.addSubview(pageViewController!.view)
    pageViewController?.didMove(toParentViewController: self)

}

func setupPageControl(){

    let appearance = UIPageControl.appearance()
    appearance.pageIndicatorTintColor=UIColor.gray
    appearance.currentPageIndicatorTintColor=UIColor.white
    appearance.backgroundColor=UIColor.darkGray


}

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

    let  itemController = viewController as! ItemViewController
    if itemController.itemIndex > 0
    {
        
        return getItemController(itemController.itemIndex-1)
        
    }

    return nil

}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
    let  itemController = viewController as! ItemViewController
    if itemController.itemIndex+1 < Contentimages.count
    {
        
        return getItemController(itemController.itemIndex+1)
        
    }
    
    return nil

}

func presentationCount(for pageViewController: UIPageViewController) -> Int {
    return Contentimages.count
}
func presentationIndex(for pageViewController: UIPageViewController) -> Int {
    return 0
}
func  currentControllerIndex() -> Int {
    let  pageItemController = self.currentController()
    if let controller = pageItemController as?ItemViewController{
        
        return controller.itemIndex
        
    }
    
    return -1
}

func currentController() -> UIViewController? {
    
    if (self.pageViewController?.viewControllers?.count)! > 0{
        
        return self.pageViewController?.viewControllers![0]
        
    }
    return nil
}
func getItemController(_ itemIndex: Int) -> ItemViewController? {
    
    if itemIndex < Contentimages.count {
        
        let pageItemController = self.storyboard?.instantiateViewController(withIdentifier: "ItemController") as! ItemViewController
        
        pageItemController.itemIndex = itemIndex
        pageItemController.imageName = Contentimages[itemIndex]
        return pageItemController
    }
    return nil
}

}

项目ViewController.swift

导入 UIKit

class 项目ViewController:UIViewController {

var itemIndex: Int = 0;
var imageName: String = ""{
    
    
    didSet{
        
        if let imageView = contentImageView{
            
            
            imageView.image = UIImage(named : imageName)
        }
                    
    }
    
   
}




@IBOutlet var contentImageView: UIImageView!
override func viewDidLoad() {
    super.viewDidLoad()
    
    contentImageView.image = UIImage(named : imageName)
           // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
}
*/

}

您可以在 ItemViewController 上添加此按钮。然后根据当前页面使按钮隐藏或可见。像这样:

let  pageItemController = self.currentController()
let currentPage = self.currentControllerIndex()

if currentPage == Contentimages.count - 1 {
    pageItemController.button.isHidden = false 
} else {
    pageItemController.button.isHidden = true 
}

例如这里(如果我正确理解你的代码):

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

    let  itemController = viewController as! ItemViewController
    if itemController.itemIndex == Contentimages.count - 1 {
        itemController.button.isHidden = false 
    } else {
        itemController.button.isHidden = true 
    }
    if itemController.itemIndex+1 < Contentimages.count {
        return getItemController(itemController.itemIndex+1)    
    }    
    return nil


}

尝试使用 UICollectionView 来实现:

1. UIViewController 包含 UICollectionView

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout
{
    override func viewDidLoad()
    {
        super.viewDidLoad()
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
    {
        return 3
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
    {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCollectionCell
        if indexPath.row == collectionView.numberOfItems(inSection: indexPath.section) - 1
        {
            cell.letsGoButton.isHidden = false
        }
        else
        {
            cell.letsGoButton.isHidden = true
        }
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
    {
        return CGSize(width: collectionView.bounds.width, height: collectionView.bounds.height)
    }
}

2。自定义 UICollectionViewCell

class CustomCollectionCell : UICollectionViewCell
{
    @IBOutlet weak var letsGoButton: UIButton!
}

3。查看层次结构

4.需要记住的事情

  1. 不要忘记设置 UICollectionViewdataSourcedelegate
  2. Storyboard 中将 Collection View Flow Layout 设置为 Horizontal