Kelas khusus UIPageControl - tidak ditemukan mengubah gambar menjadi titik

Saya perlu menerapkan UIPageControl dengan gambar khusus, bukan titik normal. Jadi saya membuat kelas khusus dan menghubungkannya melalui storyboard. Sejak ios7, subview UIPageControl berisi UIView bukannya UIImageView. Subview dari UIView(UIIpageControl subviews) yang dihasilkan tidak berisi subview apa pun jadi saya menerima kesalahan:

kesalahan fatal: tiba-tiba menemukan nil saat membuka bungkus nilai Opsional.

Di mana saya mungkin salah?

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()
    }
}

person Marco    schedule 14.01.2015    source sumber
comment
Apakah Anda menemukan solusi?   -  person Abhishek    schedule 30.04.2015


Jawaban (2)


Ini solusi saya:

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)
    }

}
person Ilya    schedule 28.05.2015
comment
ketika gulir maka self.currentPage tidak benar. Saya gulir ke halaman 1 tetapi self.currentPage masih 0 - person lee; 31.07.2015
comment
apa yang Anda sarankan dalam melakukan kontrol halaman dengan UIView khusus dengan ImageView dan Label sebagai nomor halaman? Apakah itu mungkin? - person Rhenz; 11.08.2016
comment
Bekerja untuk saya juga...Terima kasih. Saya telah memodifikasinya (@IBDesignable) sehingga saya dapat menggunakannya di storyboard. Berfungsi dengan baik :-) - person James Laurenstin; 07.10.2016
comment
@JamesLaurenstin tolong bagikan (@IBDesignable) di sini - person CAN; 17.11.2016

ubah setCurrentPage ke Halaman Saat Ini, karena itu adalah properti Obj C

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

coba ini.

person learnig kid    schedule 21.07.2016