UIPageControl 自定义类 - 发现 nil 将图像更改为点

Posted

技术标签:

【中文标题】UIPageControl 自定义类 - 发现 nil 将图像更改为点【英文标题】:UIPageControl custom class - found nil changing image to the dots 【发布时间】:2015-01-14 10:53:51 【问题描述】:

我需要使用自定义图像而不是普通点来实现 UIPageControl。所以我创建了一个自定义类并通过故事板连接它。 由于 ios7 UIPageControl 的子视图包含UIView 而不是UIImageView。结果 UIView(UIIpageControl subviews) 的子视图不包含任何子视图,所以我收到错误:

致命错误:在展开可选值时意外发现 nil

我可能错在哪里?

class WhitePageControl:UIPageControl
   let activeImage = UIImage(named: "dot_white")
   let inactiveImage = UIImage(named: "dot_white_e")

   override init(frame: CGRect)
     super.init(frame: frame)
   

   required init(coder aDecoder: NSCoder)
     super.init(coder: aDecoder)
   

   func updateDots()
     println(self.subviews.count) // 3
     println(self.numberOfPages) // 3
     for var index = 0; index < self.subviews.count; index++ 
        println(index)
        var dot:UIImageView!
        var dotView:UIView = self.subviews[index] as UIView
        println("1")
        for subview in dotView.subviews // NIL HERE
            println("2")
            if subview.isKindOfClass(UIImageView)
                println("3")
                dot = subview as UIImageView
                if index == self.currentPage dot.image = activeImage 
                else dot.image = inactiveImage 
            
            
         
       

    func setCurrentPage(value:Int)
        super.currentPage = value
        self.updateDots()
    

【问题讨论】:

你找到解决办法了吗? 【参考方案1】:

这是我的解决方案:

import Foundation

class PageControl: UIPageControl 
    var activeImage: UIImage!
    var inactiveImage: UIImage!
    override var currentPage: Int 
        //willSet 
        didSet  //so updates will take place after page changed
            self.updateDots()
        
    

    convenience init(activeImage: UIImage, inactiveImage: UIImage) 
        self.init()

        self.activeImage = activeImage
        self.inactiveImage = inactiveImage

        self.pageIndicatorTintColor = UIColor.clearColor()
        self.currentPageIndicatorTintColor = UIColor.clearColor()
    

    func updateDots() 
        for var i = 0; i < count(subviews); i++ 
            var view: UIView = subviews[i] as! UIView
            if count(view.subviews) == 0 
                self.addImageViewOnDotView(view, imageSize: activeImage.size)
            
            var imageView: UIImageView = view.subviews.first as! UIImageView
            imageView.image = self.currentPage == i ? activeImage : inactiveImage
        
    

    // MARK: - Private

    func addImageViewOnDotView(view: UIView, imageSize: CGSize) 
        var frame = view.frame
        frame.origin = CGPointZero
        frame.size = imageSize

        var imageView = UIImageView(frame: frame)
        imageView.contentMode = UIViewContentMode.Center
        view.addSubview(imageView)
    


【讨论】:

滚动时 self.currentPage 不正确。我滚动到第 1 页,但 self.currentPage 仍然为 0 在使用 ImageView 和 Label 作为页码的自定义 UIView 进行页面控件时,您有什么建议?这可能吗? 也为我工作...谢谢。我已经修改了它(@IBDesignable),所以我可以在情节提要中使用它。效果很好:-) @JamesLaurenstin 请你在这里分享它(@IBDesignable)【参考方案2】:

将 setCurrentPage 更改为 Current Page ,因为这是 Obj C 属性

 func currentPage(page: Int) 
    super.currentPage = page
    self.updateDots()

试试这个。

【讨论】:

以上是关于UIPageControl 自定义类 - 发现 nil 将图像更改为点的主要内容,如果未能解决你的问题,请参考以下文章

带有点图像的自定义 UIPageControl

自定义 UIPageControl 点在加载时错位

UIPageControl 自定义样式 Nat Geo

具有 UIPageControl 性能问题的自定义 UIScrollview

UIPageControl 不与 IOS7 中的 UIImageView 一起使用

如何在 iOS 4 中调整 UIPageControl 的指标?