わかりましたので、私はここで苦労していて、有効な解決策を見つけることができませんでした。私は自己学習してきたSwift Objective Cの経験なし(知っている、知っている)。
私のアプリには、メインのUIViewController
があります。これは、透明ですが画面の下部からスライドするサブビューと、すべてが機能するUIScrollViewであるスライドサブビューの4つのサブビューです。ページングを有効にしましたが、うまく機能しますが、それぞれにUIPageControlを追加したいと思います。私は真剣にデリゲートとSwiftを使用して実装する方法を把握できません。どんな助けも大歓迎です!
また、私はこれをすべてプログラムで実行しているので、IBはありません。役立つ場合は、コードを提供してください。ありがとう
これを行う方法を探しているあなたや他の誰かが この答え を見つけると思います。このコード例により、scrollViewにページコントロールインジケーターを作成できました。これを行うのは初めてでした。私はそれを非常に明確に見つけました。
プロジェクトに追加する必要があると思われる行は次のとおりです。
1:View Controllerクラスに最初に名前を付けるときに、プロトコルとしてUIScrollViewDelegate
を追加します。
2:クラス宣言でpageControl変数を作成します。必要な場所に表示されるようにするには、フレーム番号で遊ぶ必要があります。現在の数字は、私にとってはウィンドウの真ん中にある数字です。参考のために、数値の平均(インジケーターの左上隅のx位置、左上隅のy座標、ページインジケーターの幅、ページインジケーターの高さ)
var pageControl : UIPageControl = UIPageControl(frame: CGRectMake(50, 300, 200, 20))
viewDidLoadでscrollViewデリゲートを設定し、 `configurePageControl()を呼び出します。
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
configurePageControl()
}
viewDidLoadの後に2つのメソッドを追加する必要があります。 1つはviewDidLoadで呼び出されます
func configurePageControl() {
self.pageControl.numberOfPages = <some reference to the number of pages>
self.pageControl.currentPage = 0
self.pageControl.tintColor = UIColor.redColor()
self.pageControl.pageIndicatorTintColor = UIColor.blackColor()
self.pageControl.currentPageIndicatorTintColor = UIColor.greenColor()
self.view.addSubview(pageControl)
}
そして
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
pageControl.currentPage = Int(pageNumber)
}
ScrollViewデリゲートは、実際には設定が非常に簡単です。クラス宣言の後に追加することにより、ViewControllerクラスが実装するプロトコルとしてUIScollViewDelegateを追加します:class YourClassName: UIScrollViewDelegate
。そして、viewDidLoad()で、スクロールビューのデリゲートプロパティをscrollView.delegate = self
。 (これらのコマンドの行き先をさらに明確にする必要がある場合は、リンク先の例を参照してください)
次のようなコードでセットアップするだけです:
private var pageControl = UIPageControl(frame: .zero)
private func setupPageControl() {
pageControl.numberOfPages = controllers.count
pageControl.translatesAutoresizingMaskIntoConstraints = false
pageControl.currentPageIndicatorTintColor = UIColor.orange
pageControl.pageIndicatorTintColor = UIColor.lightGray.withAlphaComponent(0.8)
let leading = NSLayoutConstraint(item: pageControl, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 0)
let trailing = NSLayoutConstraint(item: pageControl, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: 0)
let bottom = NSLayoutConstraint(item: pageControl, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
view.insertSubview(pageControl, at: 0)
view.bringSubview(toFront: pageControl)
view.addConstraints([leading, trailing, bottom])
}
デリゲートはクラスの単なるメソッドであり、別のクラスにパームアウトできます。これらのメソッドは通常、コールバックです。
例えばユーザーがリターンを押したときのTextFieldのコールバックは、デリゲートに実装できます。デリゲートは、ViewControllerクラスに実装できます。
これで、ユーザーがヒットを返すと、TextFieldオブジェクトがViewControllerオブジェクトのデリゲートメソッドを呼び出します。これのすばらしいところは、委任されたメソッドからViewControllerオブジェクトのすべての変数とメソッドにアクセスできることです。それ以外の場合は、TextFieldオブジェクト自体内のViewControllerオブジェクトへのハンドルが必要になります。
デリゲートは、単なるインターフェイスであるプロトコルとして実装されます。したがって、ViewControllerがTextFieldDelegateプロトコルを実装している場合、すべてのテキストフィールドコールバックはViewControllerオブジェクト内から呼び出すことができます。
これがお役に立てば幸いです。
Swift 4を使用したUIPageControl統合
func configurePageControl() {
self.pageview.numberOfPages = items.count
self.pageview.currentPage = 0
self.pageview.tintColor = UIColor.red
self.pageview.pageIndicatorTintColor = UIColor.black
self.pageview.currentPageIndicatorTintColor = UIColor.green
}