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
Post a Comment