ios - why the stack view's frame is (0.0, 0.0)? -


i'm trying autolayout stack views , create arrangedsubview(2 labels , 1 image) in code, 1 set of stack view appear in simulator. when print results in console, labels , image have values, except stack view's frame 0.0;0.0. why happen this? why stack view not appear? please see code below:

code

let contentview: uiview = uiview() let stackview: uistackview = uistackview()  var singlestack = array(count: 6, repeatedvalue: uistackview()) var timelabel = array(count: 6, repeatedvalue: uilabel()) var iconimage = array(count: 6, repeatedvalue: uiimageview()) var templabel = array(count: 6, repeatedvalue: uilabel())  override func viewdidload() {     super.viewdidload()      index in 0...5 {                     timelabel[index].text = "0\(index):00"         iconimage[index].image = uiimage(named: "sunny")!         templabel[index].text = "0\(index)°"          singlestack[index].addarrangedsubview(timelabel[index])         singlestack[index].addarrangedsubview(iconimage[index])         singlestack[index].addarrangedsubview(templabel[index])          singlestack[index].translatesautoresizingmaskintoconstraints = false         singlestack[index].axis = .vertical         singlestack[index].alignment = .center         singlestack[index].distribution = .fillequally          stackview.addarrangedsubview(singlestack[index])          print("\(timelabel[index].text!)")         print("\(iconimage[index].image!)")         print("\(templabel[index].text!)")         print("\(singlestack[index])")         print("\(stackview)")         }      stackview.translatesautoresizingmaskintoconstraints = false     stackview.axis = .horizontal     stackview.alignment = .fill     stackview.distribution = .fillequally      contentview.backgroundcolor = uicolor.lightgraycolor()      view.addsubview(contentview)     contentview.addsubview(stackview)      contentview.translatesautoresizingmaskintoconstraints = false      nslayoutconstraint.activateconstraints(nslayoutconstraint.constraintswithvisualformat(         "h:|[stackview]|",         options: [],         metrics: nil,         views: ["stackview": stackview]))      nslayoutconstraint.activateconstraints(nslayoutconstraint.constraintswithvisualformat(         "v:|[stackview]|",         options: [],         metrics: nil,         views: ["stackview": stackview]))     nslayoutconstraint.activateconstraints(nslayoutconstraint.constraintswithvisualformat(         "h:|-[contentview]-|",         options: [],         metrics: nil,         views: ["contentview": contentview]))      nslayoutconstraint.activateconstraints(nslayoutconstraint.constraintswithvisualformat(         "v:[contentview(120)]-16-|",         options: [],         metrics: nil,         views: ["contentview": contentview]))  } 

the printed results in console (just use 1 piece example)

01:00 <uiimage: 0x7fb61944f630>, {32, 32} 01° <uistackview: 0x7fb6194462c0; frame = (0 0; 0 0); layer = <catransformlayer: 0x7fb619445e70>> <uistackview: 0x7fb619443b50; frame = (0 0; 0 0); layer = <catransformlayer: 0x7fb6194433b0>> 

as can see, labels , image have values, stack view's frame 0.0;0.0.

hope can solve problem, thank in advance!

when initialize array array(count: , repeatedvalue: ) , repeatedvalue class going array of pointers pointing same instance of class count times over. classes in swift passed reference. singlestack[0] === singlestack[2] === singlestack[5] etc. why 1 stack view shows up. should change loop like:

for index in 0...5 {     let singlestack = uistackview()     let timelabel = uilabel()     let iconimage = uiimageview()     let templabel = uilabel()      timelabel.text = "0\(index):00"      iconimage.image = uiimage(named: "sunny")!      templabel.text = "0\(index)°"      singlestack.addarrangedsubview(timelabel)     singlestack.addarrangedsubview(iconimage)     singlestack.addarrangedsubview(templabel)      singlestack.axis = .vertical     singlestack.alignment = .center     singlestack.distribution = .fillequally     self.stackview.addarrangedsubview(singlestack) } 

unless absolutely need array of views adding stack views , using arrangedsubviews clunky. in case better have use initialization block like:

let singlestack: [uistackview] = {     var singlestacks = [uistackview]()     _ in 0...5     {         singlestacks.append(uistackview())     }     return singlestacks }() 

etc…


Comments

Popular posts from this blog

amazon web services - S3 Pre-signed POST validate file type? -

c# - Check Keyboard Input Winforms -