2016-08-10 15 views
1

Wenn ich mein UIPageControl anpassen musste, benutzte ich this und this Lösung.Benutzerdefiniertes UIPageControl mit Punktbildern

leicht es für die neue Version der schnellen Modifizierung haben wir:

class myPageControl: UIPageControl { 
    var activeImage: UIImage! 
    var inactiveImage: UIImage! 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     activeImage = UIImage(named: "active.png")! 
     inactiveImage = UIImage(named: "inactive.png")! 
    } 

    func updateDots() 
    { 
     for i in 0 ..< self.subviews.count 
     { 
      let dot : UIImageView = imageViewForSubview(self.subviews[i]) 
      if (i == self.currentPage) { 
       dot.image = activeImage 
      } 
      else { 
       dot.image = inactiveImage 
      } 
     } 
    } 

    func imageViewForSubview(view: UIView) -> UIImageView { 
     var dot: UIImageView? = nil 
     if (view.isKindOfClass(UIView)) { 
      for subview: UIView in view.subviews { 
       if (subview is UIImageView) { 
        dot = (subview as! UIImageView) 
       } 
      } 
      if dot == nil { 
       dot = UIImageView(frame: CGRectMake(0.0, 0.0, view.frame.size.width, view.frame.size.height)) 
       view.addSubview(dot!) 
      } 
     } 
     else { 
      dot = (view as! UIImageView) 
     } 
     return dot! 
    } 

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

Mein Problem ist, dass ich das Bild nicht ändern kann, wenn Sie ersten App starten. Es ändert sich nur, wenn die Seite geändert wird.

In viewDidLoad() habe ich setPage(0) und updateDots() hinzugefügt, aber es gibt kein Ergebnis. Was könnte ich falsch machen?

Antwort

6

Swift 3.0 ... Sie wissen, ob Sie mit der Annahme des angegebenen Risikos einverstanden sind: "Die Subviews eines bestehenden Controls sind fragil".

Sie müssen "updateDots()" in viewDidAppear() und Ihren valueChanged-Handler für die Seitensteuerung aufrufen.

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 
    } 
} 
+1

Hier ist eine bessere Idee für den Aufruf von "updateDots()". Habe es noch nicht ausprobiert, aber Dmitry schlägt vor, numberOfPages und currentPage-Variablen zu überschreiben -> http://stackoverflow.com/questions/12190147/customize-dot-with-image-of-uipagecontrol-at-index-0-of- uipagecontrol/41136917 # 41136917 – CodenameDuchess

0

Sie können UIStackView verwenden, um den gewünschten Effekt zu erzielen. Geben Sie activeImageView und andere inactiveImageView s in aStackView ein. Dann ändern Sie einfach den Index activeImageView in scrollViewDidScroll(_:).

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    let index = Int(scrollView.contentOffset.x/scrollView.frame.width) 
    aStackView.insertArrangedSubview(activeImageView, at: index) 
} 

ps. UIStackView insertArrangedSubview(_:at:) aktualisiert nur den Stack-Index der arrangierten Subview, wenn es bereits in der arrangierten Subviews-Liste ist.

Verwandte Themen