ios 如何定制UIPageControl?

bq3bfh9z  于 2023-01-14  发布在  iOS
关注(0)|答案(1)|浏览(242)

我是雨燕的初学者
我只想在代码上自定义UIPageControl
我想要的UIPageControl样式是:我可以更改上面的小点,当我切换到它时,他可以更改为另一种样式
我发现一篇文章提供了一个how-to,可以使用
很好,但我不明白它是怎么运作的
附方法供有同样需求的朋友参考
但那不是我真实的
我想了解这个程序是如何工作的,有人能给我解释一下吗?或者提供一个更简单易懂的方法
我知道这么多代码是因为它支持ios14以下的版本
但我认为这部分可以省略
之所以不删除它,是为了寻求更好、更完整的代码。
谢谢大家

import UIKit

class CZPageControl: UIPageControl {
    
    var currentImage: UIImage?
    var inactiveImage: UIImage?
    var currentTintColor: UIColor?
    var inactiveTintColor: UIColor?
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.isUserInteractionEnabled = false
        if #available(iOS 14.0, *) {
            self.allowsContinuousInteraction = false
        }
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override var currentPage: Int {
        didSet {
            updateDots()
        }
    }
    
    func updateDots() {
        guard let currentImage = self.currentImage, let inactiveImage = self.inactiveImage else {
            return
        }
        
        if #available(iOS 14.0, *) {
            guard let dotContentView = findIndicatorContentView() else {
                return
            }
            
            for (index, view) in dotContentView.subviews.enumerated() {
                if view.isKind(of: UIImageView.self) {
                    self.currentPageIndicatorTintColor = self.currentTintColor
                    self.pageIndicatorTintColor = self.inactiveTintColor
                    
                    let indicatorView = view as! UIImageView
                    indicatorView.image = nil
                    if index == self.currentPage {
                        indicatorView.image = currentImage.withRenderingMode(.alwaysTemplate)
                    } else {
                        indicatorView.image = inactiveImage.withRenderingMode(.alwaysTemplate)
                    }
                }
            }
        } else {
            for (index, view) in self.subviews.enumerated() {
                if let dot = imageViewForSubview(view, currentPage: index) {
                    var size = CGSize.zero
                    
                    if index == self.currentPage {
                        dot.tintColor = self.currentTintColor
                        dot.image = currentImage.withRenderingMode(.alwaysTemplate)
                        size = dot.image!.size
                    } else {
                        dot.tintColor = self.inactiveTintColor
                        dot.image = inactiveImage.withRenderingMode(.alwaysTemplate)
                        size = dot.image!.size
                    }
                    
                    if let superview = dot.superview {
                        let x = (superview.frame.size.width - size.width) / 2.0
                        let y = (superview.frame.size.height - size.height) / 2.0
                        dot.frame = CGRect(x: x, y: y, width: size.width, height: size.height)
                    }
                }
            }
        }
    }
    
    // iOS 14之前创建UIImageView使用
    func imageViewForSubview(_ view: UIView, currentPage: Int) -> UIImageView? {
        
        var dot: UIImageView?
        if view.isKind(of: UIView.self) {
            for subview in view.subviews {
                if subview.isKind(of: UIImageView.self) {
                    dot = (subview as! UIImageView)
                    break
                }
            }
            
            if dot == nil {
                dot = UIImageView(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height))
                view.addSubview(dot!)
            }
        } else {
            dot = (view as! UIImageView)
        }
        
        return dot
    }
    
    @available(iOS 14.0, *)
    func findIndicatorContentView() -> UIView? {
        for contentView in self.subviews {
            if let contentViewClass = NSClassFromString("_UIPageControlContentView"), contentView.isKind(of: contentViewClass) {
                for indicatorContentView in contentView.subviews {
                    if let indicatorContentViewClass = NSClassFromString("_UIPageControlIndicatorContentView"), indicatorContentView.isKind(of: indicatorContentViewClass) {
                        return indicatorContentView
                    }
                }
            }
        }
        return nil
    }

}
c6ubokkw

c6ubokkw1#

您必须在viewDidAppear()中调用“updateDots()”,并为页面控件调用valueChanged处理程序。

import UIKit

class CustomImagePageControl: UIPageControl {

  let activeImage:UIImage = UIImage(named: "SelectedPage")!
  let inactiveImage:UIImage = UIImage(named: "UnselectedPage")!

  override func awakeFromNib() {
        super.awakeFromNib()

        self.pageIndicatorTintColor = UIColor.clear
        self.currentPageIndicatorTintColor = UIColor.clear
        self.clipsToBounds = false
   }

   func updateDots() {
        var i = 0
        for view in self.subviews {
            if let imageView = self.imageForSubview(view) {
                if i == self.currentPage {
                    imageView.image = self.activeImage
                } else {
                    imageView.image = self.inactiveImage
                }
                i = i + 1
            } else {
                var dotImage = self.inactiveImage
                if i == self.currentPage {
                    dotImage = self.activeImage
                }
                view.clipsToBounds = false
                view.addSubview(UIImageView(image:dotImage))
                i = i + 1
            }
        }
    }

    fileprivate func imageForSubview(_ view:UIView) -> UIImageView? {
        var dot:UIImageView?

        if let dotImageView = view as? UIImageView {
            dot = dotImageView
        } else {
            for foundView in view.subviews {
                if let imageView = foundView as? UIImageView {
                    dot = imageView
                    break
                }
            }
        }

        return dot
    }
}

相关问题