2017-03-01 7 views
0

私はルートビューコントローラのnavbarに作成したカスタムUIセグメント化コントロールを追加しようとしています。ここに私のコードだ:プログラムでNavbarのタイトルにUIControlを追加する - Swift

セグメント化されたコントロール:あなたは私が私のカスタムのUicontrolを追加することができますどのように私に言うことができる場合

class FeedViewController: UIViewController { 


let feedViewSC: FeedViewSC = { 
    let sc = FeedViewSC() 
    sc.translatesAutoresizingMaskIntoConstraints = false 
    return sc 
}() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.view.backgroundColor = UIColor.white 
    view.addSubview(feedViewSC) 
    setupFeedViewSC() 
} 

func setupFeedViewSC() { 
    feedViewSC.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor, constant: 5).isActive = true 
    feedViewSC.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    feedViewSC.heightAnchor.constraint(equalToConstant: 35).isActive = true 
    feedViewSC.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 60).isActive = true 
    feedViewSC.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -60).isActive = true 
} 

override func viewDidAppear(_ animated: Bool) { 
    let img = UIImage() 
    self.navigationController?.navigationBar.shadowImage = img 
    self.navigationController?.navigationBar.setBackgroundImage(img, for: UIBarMetrics.default) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

} 

:私は、このセグメント化されたコントロールを追加するliekう

@IBDesignable class FeedViewSC: UIControl { 


fileprivate var labels = [UILabel]() 
var thumbView = UIView() 

var items: [String] = ["Tab1", "Tab2"] { 
    didSet { 
     setupLabels() 
    } 

} 

var selectedIndex : Int = 0 { 
    didSet{ 
     displayNewSelectedIndex() 
    } 
} 

@IBInspectable var font : UIFont! = UIFont.systemFont(ofSize: 13) { 
    didSet { 
     setFont() 
    } 
} 

override init(frame: CGRect) { 
    super.init(frame: frame) 

    setupView() 
} 

required init?(coder: NSCoder) { 
    super.init(coder: coder) 
    setupView() 
} 

func setupView() { 

    layer.cornerRadius = 2 
    layer.borderColor = UIColor(red: 2/255, green: 239/255, blue: 23/255, alpha: 1).cgColor 

    backgroundColor = UIColor(red: 239/255, green: 29/255, blue: 239/255, alpha: 1) 

    setupLabels() 

    insertSubview(thumbView, at: 0) 

} 


func setupLabels() { 
    for label in labels { 
     label.removeFromSuperview() 
    } 

    labels.removeAll(keepingCapacity: true) 

    for index in 1...items.count { 
     let label = UILabel(frame: CGRect.zero) 
     label.text = items[index-1] 
     label.textAlignment = .center 
     label.font = UIFont(name: "timesnr",size: 17) 
     label.textColor = UIColor(red: 51/255, green: 51/255, blue: 51/255, alpha: 1) 
     self.addSubview(label) 
     labels.append(label) 
    } 
} 

override func layoutSubviews() { 
    super.layoutSubviews() 

    var selectFrame = self.bounds 
    let newWidth = selectFrame.width/CGFloat(items.count) 
    selectFrame.size.width = newWidth 
    thumbView.frame = selectFrame 
    thumbView.backgroundColor = UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 1) 
    thumbView.layer.cornerRadius = 5 

    let labelHeight = self.bounds.height 
    let labelWidth = self.bounds.width/CGFloat(labels.count) 

    for index in 0...labels.count - 1 { 

     let label = labels[index] 

     let xPosition = CGFloat(index) * labelWidth 
     label.frame = CGRect(x: xPosition, y: 0, width: labelWidth, height: labelHeight) 
    } 

} 

override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool { 
    let location = touch.location(in: self) 

    var calculatedIndex: Int? 
    for (index, item) in labels.enumerated() { 
     if item.frame.contains(location){ 
      calculatedIndex = index 
     } 
    } 
    if calculatedIndex != nil { 
     selectedIndex = calculatedIndex! 
     sendActions(for: .valueChanged) 
    } 

    return false 

} 


func displayNewSelectedIndex(){ 

    if(self.selectedIndex == -1){ 
     self.selectedIndex = self.items.count-1 
    } 

    let label = labels[selectedIndex] 
} 

func setFont(){ 
    for item in labels { 
     item.font = font 
    } 
} 

} 

マイVC View Controllerのナビゲーションバーのタイトルに移動します。

+0

ストーリーボードでも行うことができます。ナビゲーションバーの上にuiviewをドラッグし、クラス名をFeedViewSCとして変更します。あなたのニーズに合わせてサイズを変更することができます – Vinodh

答えて

0

FeedViewControllerあなたは少なくとも、私は、これはナビゲーションバーでそれを取得するために動作しないだろうと理由を見ない

let feedControl = FeedViewSC(frame: (self.navigationController?.navigationBar.bounds)!) 
feedControl.autoresizingMask = [.flexibleWidth,.flexibleHeight] 
self.navigationController?.navigationBar.addSubview(feedControl) 
feedControl.addTarget(self, action: #selector(FeedViewController.changingTab), for: .valueChanged) 

することにより、非常に簡単にそれを行うことができますNavigationControllerの初期ビューコントローラである場合。

また、質問の一部ではありませんが、あなたがIBであなたのコントロールを見ているのに問題がある場合は、私は示唆するかもしれません。

override func prepareForInterfaceBuilder() { 
    super.prepareForInterfaceBuilder() 
    layer.cornerRadius = 2 
    layer.borderColor = UIColor(red: 2/255, green: 239/255, blue: 23/255, alpha: 1).cgColor 
    backgroundColor = UIColor(red: 239/255, green: 29/255, blue: 239/255, alpha: 1) 
    setupLabels() 
    insertSubview(thumbView, at: 0) 
} 

コントロール自体はテストしていませんが、イベントや処理方法が値の変更と多少異なる場合があります。私はよく分かりません。

コントローラのナビゲーションバーを特別な設計可能なクラスにすることもできますが、コードで追加することはできませんが、おそらくviewDidLoadで参照を取得して使用する必要があります。設計可能で

のように見える。そして中に、あなたのコントローラでのviewDidLoadあなたがこれを行うことができますと言うでしょう。

if let navController = self.navigationController{ 
     if navController.navigationBar is DesignableNavBar{ 
      let control = (navController.navigationBar as! DesignableNavBar). feedControl 
      control?.addTarget(self, action: #selector(ViewController.changingTab), for: .valueChanged) 
     } 
    } 
+0

これはあなたのナビゲーションコントローラで見ることができるようにしたい場合は、これを正しくマークしました。上記のクラスと一致するようにuinavigationcontrollerのnavbarを変更するだけで、ナビゲーションバーのストーリーボードで指定できるようになります。楽しい – agibson007

関連する問題