2017-12-22 21 views
0

私は「閉じる」のUIButtonを「UIPageController.view」に追加するコードをいくつか持っています。UIPageControl SwiftへのUIButtonのCenterYアンカー

WORKING CODE:

class func closeButton(_ pageController: UIPageViewController) -> UIButton { 

    let button = UIButton() 

    button.setTitleColor(UIColor.white, for: UIControlState()) 
    button.setTitle("Close", for: UIControlState()) 
    button.titleLabel!.font = UIFont.systemFont(ofSize: 15) 
    button.contentHorizontalAlignment = UIControlContentHorizontalAlignment.left 
    button.translatesAutoresizingMaskIntoConstraints = false 

    pageController.view.addSubview(button) 

    button.widthAnchor.constraint(equalToConstant: 50).isActive = true 
    button.heightAnchor.constraint(equalToConstant: 36).isActive = true 
    button.trailingAnchor.constraint(equalTo: pageController.view.trailingAnchor).isActive = true 
    button.bottomAnchor.constraint(equalTo: pageController.view.bottomAnchor).isActive = true 

    return button 
} 

しかし、私はiPhone Xシミュレータ上で自分のコードをテストし、UIPageControlは他のiPhoneよりも下からもはるかに高いです。だから私が追加したばかりのボタンは丸みのある丸みを帯びていて、UIPageControlははるかに高いです。

だから、私はとUIPageControlを参照してみました:

let pageControl: UIPageControl = UIPageControl.appearance() 

し、次いでbutton.bottomAnchor.constraint...を置き換える:

button.centerYAnchor.constraint(equalTo: pageControl.centerYAnchor).isActive = true 

しかし、これはエラーがスローされます。 UIPageControl.frameを印刷しようとしましたが、それは0,0,0,0です。だから私はそれがそれと関係があると仮定しています。

UIPageControlに対して制約を設ける方法はありますか?

答えて

1

カスタムビューを使用している場合は、あなたのビューコントローラのlayoutSubviews()メソッド、またはviewDidLayoutSubviews中()メソッドでは、あなたの制約を更新しよう:

func layoutSubviews() { 
    super.layoutSubviews() 
    button.centerYAnchor.constraint(equalTo: pageControl.centerYAnchor).isActive = true 
} 
+0

私は二つの部分に機能を分割します。ボタンを作成するもの、それを制約するもの。それを作成する最初の部分は 'ViewDidLoad'を呼び出していますが、2番目の部分は' viewDidLayoutSubviews'を呼び出すための制約です。あなたは私をそこに連れて来ました。ほとんどの場合、おそらく 'viewDidLayoutSubviews'にすべてを入れることができますが、 'isHidden = true'かどうかを判断する別の部分があるので、 'ViewDidLoad'でボタンを作成する必要があります。 –

+0

良い選択;)viewDidLayoutSubviewsでは、pageControlフレームを取得しています。そのため、ボタンを作成する部分ではなく、viewDidLoadで呼び出すのが正しいです。どういたしまして ;) –

関連する問題