2017-08-02 5 views
1

Je travaille sur un projet qui a un contrôle segmenté personnalisé dans un UIScrollView. Je veux utiliser la mise en page automatique pour positionner le contrôle segmenté. J'utilise ce projet comme mon modèle: https://github.com/honghaoz/UIScrollView-and-AutoLayoutAutolayout ScrollView fonctionnant avec Label mais pas Custom Control

import UIKit 

class ViewController: UIViewController { 

    let scrollView = UIScrollView() 
    var screenBounds: CGRect { return UIScreen.main.bounds } 

    override var preferredStatusBarStyle : UIStatusBarStyle { 
     return .lightContent 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Setup scroll view 

     scrollView.translatesAutoresizingMaskIntoConstraints = false 
     scrollView.backgroundColor = UIColor(red:20/255.0, green:119/255.0, blue:61/255.0, alpha:255/255.0) 
     view.addSubview(scrollView) 

     // Setup constraints 
     var views: [String: UIView] = [ 
      "scrollView": scrollView 
     ] 

     var constraints = [NSLayoutConstraint]() 

     // External constraints 
     constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[scrollView]|", options: [], metrics: nil, views: views) 
     constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|[scrollView]|", options: [], metrics: nil, views: views) 


     // Internal constraints 
     // Note: to let scrollView determines its contentSize, four edges should be explicitly specified 
     let v1 = newLabelWithText("v1 v1 v1 v1 v1 v1 v1 v1 v1 v1") 
     scrollView.addSubview(v1) 
     views["v1"] = v1 

     //Create Segmented Control 
     let segmentedB = YSSegmentedControl(
      //Set Frame in Callback (Required) 
      frame: CGRect(x: 0, y: 0, width: 400, height: 60), 
      titles: [ 
       "Yes", 
       "No" 
      ], 
      action: { 
       control, index in 
       print ("segmented did pressed \(index)") 
     }) 
     scrollView.addSubview(segmentedB) 
     views["v4"] = segmentedB 

     let v2 = newLabelWithText("v2 v2 v2 v2 v2") 
     views["v2"] = v2 


     let v3 = newLabelWithText("v3 v3 v3 v3 v3") 
     views["v3"] = v3 
     scrollView.addSubview(v3) 

     // Horizontal, fully specified 
     constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|-200-[v4]-300-|", options: .alignAllLastBaseline, metrics: nil, views: views) 
     // Vertically, fully specified 
     constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-200-[v3]-1000-|", options: .alignAllLeading, metrics: nil, views: views) 

     NSLayoutConstraint.activate(constraints) 
     print("scrollView.contentSize: \(scrollView.contentSize)") 
    } 
} 

Pour une raison quelconque, la mise en page automatique fonctionne très bien avec les étiquettes de texte, mais pas avec le contrôle segmenté. Le callback nécessite que j'aie entré des paramètres pour CGRect, donc je définis simplement la largeur et la hauteur et laisse les paramètres de position à zéro. Cela a fonctionné quand il n'y avait pas de scrollview, mais ça ne fonctionnait pas maintenant.

De plus, je n'utilise pas de story-boards dans ce projet. Toutes les contraintes et les vues sont créées par programme.

Toute aide appréciée. Merci

Répondre

0

Je pense que vous devez ajouter cette ligne avant d'ajouter des contraintes

segmentedB.translatesAutoresizingMaskIntoConstraints = false 

Chaque fois que vous ajoutez des contraintes par programme, vous devez définir cette propriété à false pour que les contraintes prennent effet sur la vue