2016-08-10 6 views
1

私はUIPageControlをカスタマイズする必要があるとき、私はthisthisのソリューションを使用しました。ドットイメージのカスタムUIPageControl

は少し私たちが持っているSWIFTの新しいバージョンのためにそれを修正する:

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

私の問題は、あなたが最初にアプリを起動したとき、私は絵を変更することはできませんということです。 ページが変更されたときのみ変更されます。

viewDidLoad()には、setPage(0)updateDots()を追加しましたが、結果はありません。私は何が間違っていますか?

答えて

6

Swift 3.0 ...「既存のコントロールのサブビューを変更するのは脆弱です。

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

ここでは、「updateDots()」を呼び出す方が効果的です。まだ試してみませんでしたが、ドミトリーはnumberOfPagesとcurrentPage変数をオーバーライドすることを提案します - > http://stackoverflow.com/questions/12190147/customize-dot-with-image-of-uipagecontrol-at-index-0-of- uipagecontrol/41136917#41136917 – CodenameDuchess

0

UIStackViewを使用すると、効果を得ることができます。

activeImageViewと他のinactiveImageViewaStackViewに入れてください。 activeImageViewのインデックスをscrollViewDidScroll(_:)に変更するだけです。

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

ps UIStackViewのinsertArrangedSubview(_:at:)は、配列されたサブビューのスタックインデックスが既に配列されたSubviewsリストにある場合にのみ更新します。

関連する問題