美文网首页
iOS Swift 自定义UIPageControl

iOS Swift 自定义UIPageControl

作者: Yuency | 来源:发表于2019-06-13 12:05 被阅读0次

前言:

UI设计师总是喜欢自己搞一些特殊样式的控件,他/她/它们觉得这样能够体现他/她/它们独特的审美。

Swift
代码地址:https://github.com/gityuency/Autolayout
示例代码类名 【PageControlViewController】 【YXPageControl】

效果图:


PG示例.gif

支持XIB编辑


PG支持XIB.gif

这个暂时没有做动画,可以改变每个点的大小,圆角,颜色,和总的点数,点之间的间隔,设置当前选中点,等等之类的。
继承自 UIView, 支持 XIB, 用的时候需要设置约束。

代码 请复制,请粘贴。


import UIKit

@IBDesignable
class YXPageControl: UIView {
    
    /// 设置当前页
    @IBInspectable var currentPage: Int = 0 {
        didSet {
            if oldValue != currentPage {
                updateSubViewFrame()
            }
        }
    }
    
    /// 总页数
    @IBInspectable var totalCount: Int = 3 {
        didSet {
            _ = subviews.map { view  in
                view.removeFromSuperview()
            }
            for _ in 0..<totalCount {
                let view = UIView()
                addSubview(view)
            }
            updateSubViewFrame()
        }
    }
    
    /// 普通样式圆角
    @IBInspectable var itemNormalCornerRadius: CGFloat = 0 {
        didSet {
            if oldValue != itemNormalCornerRadius {
                for (index, view) in subviews.enumerated() {
                    if index != currentPage {
                        view.layer.cornerRadius = itemNormalCornerRadius
                    }
                }
            }
        }
    }
    
    /// 选中样式圆角
    @IBInspectable var itemCurrentCornerRadius: CGFloat = 0 {
        didSet {
            if oldValue != itemCurrentCornerRadius && currentPage >= 0 && currentPage < subviews.count {
                subviews[currentPage].layer.cornerRadius = itemCurrentCornerRadius
            }
        }
    }
    
    /// 选中的颜色
    @IBInspectable var itemNormalColor: UIColor = UIColor.red {
        didSet {
            if oldValue != itemNormalColor {
                for (index, view) in subviews.enumerated() {
                    if index != currentPage {
                        view.backgroundColor = itemNormalColor
                    }
                }
            }
        }
    }
    
    /// 普通的颜色
    @IBInspectable var itemCurrentColor: UIColor = UIColor.black {
        didSet {
            if oldValue != itemNormalColor && currentPage >= 0 && currentPage < subviews.count {
                subviews[currentPage].backgroundColor = itemCurrentColor
            }
        }
    }
    
    /// 每个点之间的间隔距离
    @IBInspectable var itemSpace: CGFloat = 10 {  //最小的间距是按照普通u原点和选中原点的大小来比较的取 最大的那个值
        didSet {
            if oldValue != itemSpace {
                updateSubViewFrame()
            }
        }
    }
    
    /// 普通点的大小
    @IBInspectable var itemNormalSize: CGSize = CGSize(width: 20, height: 20) {
        didSet {
            if oldValue != itemNormalSize {
                updateSubViewFrame()
            }
        }
    }
    
    /// 选中点的大小
    @IBInspectable var itemCurrentSize: CGSize = CGSize(width: 20, height: 20) {
        didSet {
            if oldValue != itemCurrentSize {
                updateSubViewFrame()
            }
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    private func updateSubViewFrame() {
        
        let itemWidth = itemNormalSize.width
        
        let floatTotalCount = CGFloat(totalCount)
        
        let oriX = (frame.width - (floatTotalCount * itemWidth + (floatTotalCount - 1) * itemSpace)) / 2
        
        let oriYnormal = (frame.height - itemNormalSize.height) / 2
        
        for (index, view) in subviews.enumerated() {
            view.frame = CGRect(x: oriX + CGFloat(index) * (itemWidth + itemSpace), y: oriYnormal, width: itemNormalSize.width, height: itemNormalSize.height)
            view.backgroundColor = itemNormalColor
        }
        
        if currentPage >= 0 && currentPage < subviews.count {
            let currentView = subviews[currentPage]
            let currentCenter = currentView.center
            currentView.frame = CGRect(x: 0, y: 0, width: itemCurrentSize.width, height: itemCurrentSize.height)
            currentView.center = currentCenter
            currentView.backgroundColor = itemCurrentColor
        }
    }
}

相关文章

网友评论

      本文标题:iOS Swift 自定义UIPageControl

      本文链接:https://www.haomeiwen.com/subject/ptwjfctx.html