2017-10-02 2 views
2

J'ai vue contrôleur avec vues: vue de niveau supérieur Contient Conteneur Vue qui contient deux vues: bottomView, topView, comme indiqué.Afficher par programme UIScrollView dans Swift

view controller

Scène

scene

Je veux afficher de: à: plage de dates dans le Topview. Dans le bottomView je veux afficher un UIScrollView qui contient deux colonnes que je peux faire défiler. Je l'ai fait mais les vues topView et BottomView se chevauchent lorsque je présente scrollView. Quand je défile, je peux voir les vues se séparer et dès que je lâche la barre de défilement, elles se chevauchent à nouveau.

enter image description here

quelqu'un peut me dire comment résoudre ce problème? Je ne comprends pas comment les scrollView et bottomView doivent être associés. code ci-dessous:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    scrollView.frame = view.bounds 

    //scrollView.frame = innerView.bounds 
    innerView.frame = CGRect(x:0, y:0, width:scrollView.contentSize.width, height:scrollView.contentSize.height) 
} 
func buildBottomView() { 
    let screenSize = UIScreen.main.bounds 
    let screenWidth = screenSize.width 
    let ht:Int = 21 
    let incrX:Int = 5 
    let incrY:Int = 5 
    let gapCol1:Int = 5 
    let col1Width:Int = 65 
    let col2Width:Int = 65 
    let startY:Int = 5 
    let col1StartX:Int = 10 
    let col2StartX:Int = col1StartX + col1Width + gapCol1 

    var loadRowStartY: Int = 0 
    // column headers 
    categoryColumnLabel.text = "Interval" 
    categoryColumnLabel.font = UIFont.preferredFont(forTextStyle:UIFontTextStyle.subheadline) 
    //categoryColumnLabel.font = UIFont.systemFont(ofSize: 14) 
    categoryColumnLabel.frame = CGRect(x: col1StartX, y:startY, width: col1Width, height: ht) 
    categoryColumnLabel.textAlignment = NSTextAlignment.left 
    categoryColumnLabel.tag = 1 
    innerView.addSubview(categoryColumnLabel) 

    valueColumnLabel.text = "Values" 
    valueColumnLabel.font = UIFont.preferredFont(forTextStyle:UIFontTextStyle.subheadline) 
    //valueColumnLabel.font = UIFont.systemFont(ofSize: 14) 
    valueColumnLabel.frame = CGRect(x: col2StartX, y:startY, width: col2Width, height: ht) 
    valueColumnLabel.textAlignment = NSTextAlignment.center 
    valueColumnLabel.tag = 3 
    innerView.addSubview(valueColumnLabel) 

    let sepLine:UIView = UIView() 
    sepLine.frame = CGRect(x: col1StartX, y:startY+ht+incrY, width: Int(screenWidth-20), height: 2) 
    sepLine.backgroundColor = UIColor.darkGray 
    sepLine.tag = 60 

    loadRowStartY = startY+ht+incrX+ht 
    innerView.addSubview(sepLine) 



    for i in 0 ..< 24 { 

     let timeIntervalLabel = UILabel() 
     let value2Label = UILabel() 

     print("display load profile") 

     let loadStruct = loadDict[String(i)] as! CommercialProfile 
     print (loadStruct.timeInterval) 

     timeIntervalLabel.text = loadStruct.timeInterval 
     timeIntervalLabel.font = UIFont.preferredFont(forTextStyle:UIFontTextStyle.caption1) 

     //valueColumnLabel.font = UIFont.systemFont(ofSize: 14) 
     timeIntervalLabel.frame = CGRect(x: col1StartX, y:loadRowStartY, width: col1Width, height: Int(timeIntervalLabel.font.lineHeight)) 
     timeIntervalLabel.textAlignment = NSTextAlignment.center 
     innerView.addSubview(timeIntervalLabel) 

     print(loadStruct.value) 

     value2Label.text = loadStruct.value 
     value2Label.font = UIFont.preferredFont(forTextStyle:UIFontTextStyle.caption1) 
     //value2Label = UIFont.systemFont(ofSize: 14) 
     value2Label.frame = CGRect(x: col2StartX, y:loadRowStartY, width: col2Width, height: Int(value2Label.font.lineHeight)) 
     value2Label.textAlignment = NSTextAlignment.center 
     innerView.addSubview(value2Label) 

     loadRowStartY = loadRowStartY + incrY + Int(value2Label.font.lineHeight) 

    } 
+0

Essayez d'utiliser Voir la fonction de débogage de Xcode pour capturer l'interface utilisateur au moment de l'exécution. Vous pouvez ensuite regarder les contraintes et afficher les emplacements pour voir ce qui se passe. –

+0

clipToBounds va aider à résoudre ce problème –

Répondre

0

vous configurez les limites de la ScrollView à la taille de la vue entière avec ce code: scrollView.frame = view.bounds.

La fonction scrollView n'a besoin que de faire défiler le contenu dans la vue du bas. Les vues de défilement ont leur propre contenu, qui est normalement plus grand que la zone visible de l'écran/de la vue. La vue déroulante vous permet simplement de panoramiquer la fenêtre de cette vue.

Ajoutez donc la vue du bas et configurez vos contraintes sur cela. ajoutez le scrollView à la vue du bas, puis ajoutez votre contenu dans le scrollView.

Assurez-vous que votre vue de fond a clipToBounds définie sur true, puis vous devriez pouvoir garder les en-têtes en place et simplement faire défiler le contenu.

Je vais essayer de mettre un exemple ensemble pour vous sous peu.

EDIT:

Je viens de créer cet exemple simple qui montre le comportement de défilement dont vous avez besoin. Cela fonctionne dans un terrain de jeu ou juste comme un simple contrôleur de vue. J'ai volontairement pas utilisé la mise en page automatique ou des contraintes de configuration en raison du temps, mais vous verrez ce que vous devez résoudre votre problème

class ViewController: UIViewController { 

    var topView: UIView! 
    var bottomView: UIView! 
    var scrollView: UIScrollView! 
    var contentView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let screenSize = UIScreen.main.bounds 

     self.topView = UIView(frame: CGRect(x: 0, y: 0, width: screenSize.width, height: 100)) 
     self.bottomView = UIView(frame: CGRect(x: 0, y: 100, width: screenSize.width, height: screenSize.height - 100)) 
     self.scrollView = UIScrollView(frame: CGRect(x: 0, y: 100, width: screenSize.width, height: screenSize.height - 100)) 
     self.contentView = UIView(frame: CGRect(x: 0, y: 0, width: screenSize.width, height: screenSize.height * 3)) 

     self.view.backgroundColor = .white 
     self.view.addSubview(self.topView) 
     self.view.addSubview(self.bottomView) 
     self.bottomView.addSubview(self.scrollView) 
     self.scrollView.addSubview(self.contentView) 
     self.bottomView.clipsToBounds = true 


     self.scrollView.contentSize = CGSize(width: screenSize.width, height: screenSize.height * 3) 
     self.contentView.backgroundColor = .gray 
    } 
}