ios - ScrollView Won't Scroll AHHH -
for life of me can't figure out i'm doing wrong. i'm trying put bunch of text fields in scroll view , have intrinsically determine contentsize using auto layout. unlike other tutorials i've watched , read out there, i'm trying programmatically, not through storyboards or xibs.
i've called settranslatesautoresizingmaskintoconstraints(false) on every view in scroll view (including on scroll view itself).
i've set height , width of scroll view match it's superview , positioned scroll view in center of it's superview (i read need working)
i've pinned content view's edges top, leading, trailing, , bottom edges of it's superview (the scroll view)
here's code:
class viewcontroller: uiviewcontroller { var scrollview = uiscrollview() var contentview = uiview() var textfield1 = customtextfield() var textfield2 = customtextfield() var textfield3 = customtextfield() var textfield4 = customtextfield() var textfield5 = customtextfield() var textfield6 = customtextfield() override func viewdidload() { super.viewdidload() scrollview.settranslatesautoresizingmaskintoconstraints(false) contentview.settranslatesautoresizingmaskintoconstraints(false) textfield1.settranslatesautoresizingmaskintoconstraints(false) textfield2.settranslatesautoresizingmaskintoconstraints(false) textfield3.settranslatesautoresizingmaskintoconstraints(false) textfield4.settranslatesautoresizingmaskintoconstraints(false) textfield5.settranslatesautoresizingmaskintoconstraints(false) textfield6.settranslatesautoresizingmaskintoconstraints(false) view.addsubview(scrollview) scrollview.addsubview(contentview) contentview.addsubview(textfield1) contentview.addsubview(textfield2) contentview.addsubview(textfield3) contentview.addsubview(textfield4) contentview.addsubview(textfield5) contentview.addsubview(textfield6) contentview.backgroundcolor = .redcolor() setupconstraints() } func setupconstraints() { // install height , width constraints on our scroll view let heightlc : nslayoutconstraint = nslayoutconstraint(item: scrollview, attribute: nslayoutattribute.height, relatedby: nslayoutrelation.equal, toitem: self.view, attribute: nslayoutattribute.height, multiplier: 1.0, constant: 0) let widthlc : nslayoutconstraint = nslayoutconstraint(item: scrollview, attribute: nslayoutattribute.width, relatedby: nslayoutrelation.equal, toitem: self.view, attribute: nslayoutattribute.width, multiplier: 1.0, constant: 0) self.view.addconstraints([heightlc,widthlc]) // install centering constraints on our scroll view let centerxlc : nslayoutconstraint = nslayoutconstraint(item: scrollview, attribute: nslayoutattribute.centerx, relatedby: nslayoutrelation.equal, toitem: self.view, attribute: nslayoutattribute.centerx, multiplier: 1.0, constant: 0) let centerylc : nslayoutconstraint = nslayoutconstraint(item: scrollview, attribute: nslayoutattribute.centery, relatedby: nslayoutrelation.equal, toitem: self.view, attribute: nslayoutattribute.centery, multiplier: 1.0, constant: 0) self.view.addconstraints([centerxlc,centerylc]) // set content view resizes same proportions on screen rotations // let contentviewtoplc : nslayoutconstraint = nslayoutconstraint(item: contentview, attribute: nslayoutattribute.top, relatedby: nslayoutrelation.equal, toitem: scrollview, attribute: nslayoutattribute.top, multiplier: 1.0, constant: 0) let contentviewleadinglc : nslayoutconstraint = nslayoutconstraint(item: contentview, attribute: nslayoutattribute.leading, relatedby: nslayoutrelation.equal, toitem: scrollview, attribute: nslayoutattribute.leading, multiplier: 1.0, constant: 0) let contentviewtrailinglc : nslayoutconstraint = nslayoutconstraint(item: contentview, attribute: nslayoutattribute.trailing, relatedby: nslayoutrelation.equal, toitem: scrollview, attribute: nslayoutattribute.trailing, multiplier: 1.0, constant: 0) let contentviewbottomlc : nslayoutconstraint = nslayoutconstraint(item: contentview, attribute: nslayoutattribute.bottom, relatedby: nslayoutrelation.equal, toitem: scrollview, attribute: nslayoutattribute.bottom, multiplier: 1.0, constant: 0) let contentviewwidthlc : nslayoutconstraint = nslayoutconstraint(item: contentview, attribute: nslayoutattribute.width, relatedby: nslayoutrelation.equal, toitem: scrollview, attribute: nslayoutattribute.width, multiplier: 1.0, constant: 0) let contentviewheightlc : nslayoutconstraint = nslayoutconstraint(item: contentview, attribute: nslayoutattribute.height, relatedby: nslayoutrelation.equal, toitem: scrollview, attribute: nslayoutattribute.height, multiplier: 1.0, constant: 0) scrollview.addconstraints([contentviewtoplc,contentviewleadinglc,contentviewtrailinglc,contentviewbottomlc,contentviewwidthlc,contentviewheightlc]) // setup text field constraints let textfield1top : nslayoutconstraint = nslayoutconstraint(item: textfield1, attribute: nslayoutattribute.top, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.top, multiplier: 1.0, constant: 0) let textfield1leading : nslayoutconstraint = nslayoutconstraint(item: textfield1, attribute: nslayoutattribute.leading, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.leading, multiplier: 1.0, constant: 40) let textfield1trailing : nslayoutconstraint = nslayoutconstraint(item: textfield1, attribute: nslayoutattribute.trailing, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.trailing, multiplier: 1.0, constant: -40) contentview.addconstraints([textfield1top, textfield1leading, textfield1trailing]) let textfield2top : nslayoutconstraint = nslayoutconstraint(item: textfield2, attribute: nslayoutattribute.top, relatedby: nslayoutrelation.equal, toitem: textfield1, attribute: nslayoutattribute.bottom, multiplier: 1.0, constant: 100) let textfield2leading : nslayoutconstraint = nslayoutconstraint(item: textfield2, attribute: nslayoutattribute.leading, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.leading, multiplier: 1.0, constant: 40) let textfield2trailing : nslayoutconstraint = nslayoutconstraint(item: textfield2, attribute: nslayoutattribute.trailing, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.trailing, multiplier: 1.0, constant: -40) contentview.addconstraints([textfield2top, textfield2leading, textfield2trailing]) let textfield3top : nslayoutconstraint = nslayoutconstraint(item: textfield3, attribute: nslayoutattribute.top, relatedby: nslayoutrelation.equal, toitem: textfield2, attribute: nslayoutattribute.bottom, multiplier: 1.0, constant: 100) let textfield3leading : nslayoutconstraint = nslayoutconstraint(item: textfield3, attribute: nslayoutattribute.leading, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.leading, multiplier: 1.0, constant: 40) let textfield3trailing : nslayoutconstraint = nslayoutconstraint(item: textfield3, attribute: nslayoutattribute.trailing, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.trailing, multiplier: 1.0, constant: -40) contentview.addconstraints([textfield3top, textfield3leading, textfield3trailing]) let textfield4top : nslayoutconstraint = nslayoutconstraint(item: textfield4, attribute: nslayoutattribute.top, relatedby: nslayoutrelation.equal, toitem: textfield3, attribute: nslayoutattribute.bottom, multiplier: 1.0, constant: 100) let textfield4leading : nslayoutconstraint = nslayoutconstraint(item: textfield4, attribute: nslayoutattribute.leading, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.leading, multiplier: 1.0, constant: 40) let textfield4trailing : nslayoutconstraint = nslayoutconstraint(item: textfield4, attribute: nslayoutattribute.trailing, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.trailing, multiplier: 1.0, constant: -40) contentview.addconstraints([textfield4top, textfield4leading, textfield4trailing]) let textfield5top : nslayoutconstraint = nslayoutconstraint(item: textfield5, attribute: nslayoutattribute.top, relatedby: nslayoutrelation.equal, toitem: textfield4, attribute: nslayoutattribute.bottom, multiplier: 1.0, constant: 100) let textfield5leading : nslayoutconstraint = nslayoutconstraint(item: textfield5, attribute: nslayoutattribute.leading, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.leading, multiplier: 1.0, constant: 40) let textfield5trailing : nslayoutconstraint = nslayoutconstraint(item: textfield5, attribute: nslayoutattribute.trailing, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.trailing, multiplier: 1.0, constant: -40) contentview.addconstraints([textfield5top, textfield5leading, textfield5trailing]) let textfield6top : nslayoutconstraint = nslayoutconstraint(item: textfield6, attribute: nslayoutattribute.top, relatedby: nslayoutrelation.equal, toitem: textfield5, attribute: nslayoutattribute.bottom, multiplier: 1.0, constant: 100) let textfield6leading : nslayoutconstraint = nslayoutconstraint(item: textfield6, attribute: nslayoutattribute.leading, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.leading, multiplier: 1.0, constant: 40) let textfield6trailing : nslayoutconstraint = nslayoutconstraint(item: textfield6, attribute: nslayoutattribute.trailing, relatedby: nslayoutrelation.equal, toitem: contentview, attribute: nslayoutattribute.trailing, multiplier: 1.0, constant: -40) let textfield6bottom : nslayoutconstraint = nslayoutconstraint(item: textfield6, attribute: nslayoutattribute.bottom, relatedby: nslayoutrelation.greaterthanorequal, toitem: contentview, attribute: nslayoutattribute.bottom, multiplier: 1.0, constant: 0) contentview.addconstraints([textfield6top, textfield6leading, textfield6trailing, textfield6bottom]) } override func didreceivememorywarning() { super.didreceivememorywarning() // dispose of resources can recreated. } } and here's customtextfield class use text fields:
class customtextfield: uitextfield { override init(frame: cgrect) { super.init(frame: frame) backgroundcolor = .whitecolor() // set text field height 55pts let heightlc : nslayoutconstraint = nslayoutconstraint(item: self, attribute: nslayoutattribute.height, relatedby: nslayoutrelation.equal, toitem: nil, attribute: nslayoutattribute.notanattribute, multiplier: 1, constant: 55) addconstraint(heightlc) } required init(coder adecoder: nscoder) { fatalerror("init(coder:) has not been implemented") } } here's app looks (notice 6th text field isn't being displayed , can't scroll down it):
any appreciated :)

the problem these lines:
let contentviewtoplc : nslayoutconstraint = nslayoutconstraint(item: contentview, attribute: nslayoutattribute.top, relatedby: nslayoutrelation.equal, toitem: scrollview, attribute: nslayoutattribute.top, multiplier: 1.0, constant: 0) let contentviewleadinglc : nslayoutconstraint = nslayoutconstraint(item: contentview, attribute: nslayoutattribute.leading, relatedby: nslayoutrelation.equal, toitem: scrollview, attribute: nslayoutattribute.leading, multiplier: 1.0, constant: 0) let contentviewtrailinglc : nslayoutconstraint = nslayoutconstraint(item: contentview, attribute: nslayoutattribute.trailing, relatedby: nslayoutrelation.equal, toitem: scrollview, attribute: nslayoutattribute.trailing, multiplier: 1.0, constant: 0) let contentviewbottomlc : nslayoutconstraint = nslayoutconstraint(item: contentview, attribute: nslayoutattribute.bottom, relatedby: nslayoutrelation.equal, toitem: scrollview, attribute: nslayoutattribute.bottom, multiplier: 1.0, constant: 0) let contentviewwidthlc : nslayoutconstraint = nslayoutconstraint(item: contentview, attribute: nslayoutattribute.width, relatedby: nslayoutrelation.equal, toitem: scrollview, attribute: nslayoutattribute.width, multiplier: 1.0, constant: 0) let contentviewheightlc : nslayoutconstraint = nslayoutconstraint(item: contentview, attribute: nslayoutattribute.height, relatedby: nslayoutrelation.equal, toitem: scrollview, attribute: nslayoutattribute.height, multiplier: 1.0, constant: 0) scrollview.addconstraints([contentviewtoplc,contentviewleadinglc,contentviewtrailinglc,contentviewbottomlc,contentviewwidthlc,contentviewheightlc]) what want not content view sized like scroll view @ all. keeping scroll view scrolling. want content view's 4 edges pinned 4 edges of scroll view.
that way, contents of content view push outwards on content view, sizing it. try become bigger scroll view. can't, because you're going pin sides of scroll view its superview. thus, content view's size become bounds size of scroll view - contentsize. when contentsize of scroll view bigger scroll view, scrollable.
Comments
Post a Comment