{"id":2212,"date":"2018-01-16T02:01:14","date_gmt":"2018-01-16T07:01:14","guid":{"rendered":"http:\/\/www.rexfeng.com\/blog\/?p=2212"},"modified":"2018-01-16T02:01:14","modified_gmt":"2018-01-16T07:01:14","slug":"vertically-scrolling-uiimage-programmatically","status":"publish","type":"post","link":"https:\/\/www.rexfeng.com\/blog\/2018\/01\/vertically-scrolling-uiimage-programmatically\/","title":{"rendered":"Vertically Scrolling UIImage programmatically"},"content":{"rendered":"<p>Working on a small side project, I wanted to display images in my view controller view at full device width in a vertical scrolling view. Sounds simple right? The good news is that it is. While you may want to use\u00a0<a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uitableview\">UITableView<\/a> for more control, using\u00a0<a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uistackview\">UIStackView<\/a> is a simpler way to get up and running fast.<\/p>\n<p>For my sample code, I opted to do it programmatically as it&#8217;s easier to copy &amp; paste code than explain what constraints to add in Xcode. Also note that the code presented here is a proof of concept, quick and dirty example (not intended for production).<\/p>\n<p>The steps are easy to understand:<\/p>\n<ol>\n<li>Add a scroll view to your view\n<pre class=\"p1\"><span class=\"s1\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><\/span>self<span class=\"s1\">.<\/span><span class=\"s2\">scrollView<\/span><span class=\"s1\"> = <\/span>UIScrollView<span class=\"s1\">()<\/span>\r\n<span class=\"s1\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><\/span><span class=\"s2\">scrollView<\/span><span class=\"s1\">.<\/span>translatesAutoresizingMaskIntoConstraints<span class=\"s1\"> = <\/span><span class=\"s3\">false<\/span>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span class=\"s4\">view<\/span>.<span class=\"s3\">addSubview<\/span>(<span class=\"s2\">scrollView<\/span>)\r\n\r\n<span class=\"s1\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><\/span><span class=\"s2\">scrollView<\/span><span class=\"s1\">.<\/span>topAnchor<span class=\"s1\">.<\/span><span class=\"s3\">constraint<\/span><span class=\"s1\">(equalTo: <\/span>view<span class=\"s1\">.<\/span>safeAreaLayoutGuide<span class=\"s1\">.<\/span>topAnchor<span class=\"s1\">).<\/span>isActive<span class=\"s1\"> = <\/span><span class=\"s3\">true<\/span>\r\n<span class=\"s1\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><\/span><span class=\"s2\">scrollView<\/span><span class=\"s1\">.<\/span>bottomAnchor<span class=\"s1\">.<\/span><span class=\"s3\">constraint<\/span><span class=\"s1\">(equalTo: <\/span>view<span class=\"s1\">.<\/span>safeAreaLayoutGuide<span class=\"s1\">.<\/span>bottomAnchor<span class=\"s1\">).<\/span>isActive<span class=\"s1\"> = <\/span><span class=\"s3\">true<\/span>\r\n<span class=\"s1\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><\/span><span class=\"s2\">scrollView<\/span><span class=\"s1\">.<\/span>leadingAnchor<span class=\"s1\">.<\/span><span class=\"s3\">constraint<\/span><span class=\"s1\">(equalTo: <\/span>view<span class=\"s1\">.<\/span>safeAreaLayoutGuide<span class=\"s1\">.<\/span>leadingAnchor<span class=\"s1\">).<\/span>isActive<span class=\"s1\"> = <\/span><span class=\"s3\">true<\/span>\r\n<span class=\"s1\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><\/span><span class=\"s2\">scrollView<\/span><span class=\"s1\">.<\/span>trailingAnchor<span class=\"s1\">.<\/span><span class=\"s3\">constraint<\/span><span class=\"s1\">(equalTo: <\/span>view<span class=\"s1\">.<\/span>safeAreaLayoutGuide<span class=\"s1\">.<\/span>trailingAnchor<span class=\"s1\">).<\/span>isActive<span class=\"s1\"> = <\/span><span class=\"s3\">true<\/span><\/pre>\n<\/li>\n<li>Add a stack view to your scroll view\n<pre class=\"p1\"><span class=\"s1\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><\/span>self<span class=\"s1\">.<\/span><span class=\"s2\">stackView<\/span><span class=\"s1\"> = <\/span>UIStackView<span class=\"s1\">()<\/span>\r\n<span class=\"s1\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><\/span><span class=\"s2\">stackView<\/span><span class=\"s1\">.<\/span>translatesAutoresizingMaskIntoConstraints<span class=\"s1\"> = <\/span><span class=\"s3\">false<\/span>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span class=\"s2\">stackView<\/span>.<span class=\"s4\">axis<\/span> = .<span class=\"s5\">vertical<\/span>\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span class=\"s2\">stackView<\/span>.<span class=\"s4\">spacing<\/span> = <span class=\"s5\">23.0<\/span>\r\n<span class=\"s1\"><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><\/span>scrollView<span class=\"s1\">.<\/span><span class=\"s3\">addSubview<\/span><span class=\"s1\">(<\/span>stackView<span class=\"s1\">)<\/span>\r\n\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span class=\"s2\">scrollView<\/span>.<span class=\"s3\">addConstraints<\/span>(<span class=\"s3\">NSLayoutConstraint<\/span>.<span class=\"s3\">constraints<\/span>(withVisualFormat: <span class=\"s5\">\"H:|[stackView]|\"<\/span>, options: <span class=\"s3\">NSLayoutFormatOptions<\/span>.<span class=\"s4\">alignAllCenterX<\/span>, metrics: <span class=\"s3\">nil<\/span>, views: [<span class=\"s5\">\"stackView\"<\/span>: <span class=\"s2\">stackView<\/span>]))\r\n<span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span class=\"s2\">scrollView<\/span>.<span class=\"s3\">addConstraints<\/span>(<span class=\"s3\">NSLayoutConstraint<\/span>.<span class=\"s3\">constraints<\/span>(withVisualFormat: <span class=\"s5\">\"V:|[stackView]|\"<\/span>, options: <span class=\"s3\">NSLayoutFormatOptions<\/span>.<span class=\"s4\">alignAllCenterX<\/span>, metrics: <span class=\"s3\">nil<\/span>, views: [<span class=\"s5\">\"stackView\"<\/span>: <span class=\"s2\">stackView<\/span>]))<\/pre>\n<\/li>\n<li>Add images to your stack view\n<pre class=\"p1\"><span class=\"s1\">stackView<\/span><span class=\"s2\">.<\/span>addArrangedSubview<span class=\"s2\">(<\/span><span class=\"s3\">image<\/span><span class=\"s2\">(filename: <\/span><span class=\"s3\">\"photo1\"<\/span><span class=\"s2\">))<\/span><\/pre>\n<\/li>\n<\/ol>\n<p>For the full code, read the <a href=\"https:\/\/github.com\/xta\/ScrollingImages\/blob\/master\/ScrollingImages\/ViewController.swift\">ViewController<\/a> on <a href=\"https:\/\/github.com\/xta\/ScrollingImages\">GitHub<\/a><\/p>\n<p>Hope this helps you if you&#8217;re trying to throw together a quick prototype of vertically scrolling images in iOs.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Working on a small side project, I wanted to display images in my view controller view at full device width in a vertical scrolling view. Sounds simple right? The good news is that it is. While you may want to use\u00a0UITableView for more control, using\u00a0UIStackView is a simpler way to get up and running fast. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1029],"tags":[1373,966,1372,1174,1370,1371],"class_list":["post-2212","post","type-post","status-publish","format-standard","hentry","category-programming","tag-images","tag-ios","tag-scrolling","tag-swift","tag-uiscrollview","tag-uistackview"],"_links":{"self":[{"href":"https:\/\/www.rexfeng.com\/blog\/wp-json\/wp\/v2\/posts\/2212","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rexfeng.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rexfeng.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rexfeng.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rexfeng.com\/blog\/wp-json\/wp\/v2\/comments?post=2212"}],"version-history":[{"count":5,"href":"https:\/\/www.rexfeng.com\/blog\/wp-json\/wp\/v2\/posts\/2212\/revisions"}],"predecessor-version":[{"id":2217,"href":"https:\/\/www.rexfeng.com\/blog\/wp-json\/wp\/v2\/posts\/2212\/revisions\/2217"}],"wp:attachment":[{"href":"https:\/\/www.rexfeng.com\/blog\/wp-json\/wp\/v2\/media?parent=2212"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rexfeng.com\/blog\/wp-json\/wp\/v2\/categories?post=2212"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rexfeng.com\/blog\/wp-json\/wp\/v2\/tags?post=2212"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}