Stop using Spacer in SwiftUI (and what to use instead)

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
In SwiftUI it's often advisable to avoid  using Spacer unnecessarily. My Spacer can be   a handy tool for creating flexible layouts over  using it can lead to unexpected spacing issues   and make your code harder to maintain instead use frame. This approach not only makes your code more   readable but also ensures better control over  the placement and distribution of views in your   SwiftUI interfaces. Promoting a more organized  and maintainable codebases. Yes, Spacer is used   everywhere in Swift UIbut today I'm going to  show you a better way of aligning your views.   We are going to go through how to use Spacer  and what's it good for and then what are the   disadvantages and then I'm going to show you what  to do instead. So I have set up here vanilla Xcode   project. Now if we a build and run this in the  Simulator you will see that we have the globe   and the hello world text. This is centered that's  how VStacks, that's how containers work,   they are centered. So what are Spacers? Well with Spacers  you can just space, you can just push out, well push   to a somewhere all of the other views. You see it's just pushed up. Now why is this happening?   You have to understand why is this layout the  way it is and for that you need to understand   a concept about layouts in SwiftUI and that is  there are basically two types of using SwiftUI,   one is a push out view that is trying to push  everything away from itself. It's trying to take   up as much space as it can and the other type of  view is a pull in view. It's trying to pull every   other view around itself to itself, it's trying  to stay as small as possible. Now as you can see   hello word the text and also the image, the system  named image is a pull in view. It's trying to pull   everything around itself and also the Spacer is a  push out you. It's trying to take up as much space   as it came. The same goes for a color, let's just have a color right over here so you may   better understand how these push out views work. So the color is taking up as much space as it can and   also as you can see there's also a padding so as  much space as it can. So that's our one use of a   Spacer. As you can see also the color is doing the  same thing because it has the same properties. It's a push out view but what if we are using a Spacer  with a color. So for that I'm going to remove the   padding, let's build and run again so we can see  what's going on right over here and I'm going to   add just a Spacer right over here and let's just  remove this vertical stack into a horizontal stack. So let's change that. Now as you can see the  spacer now behaves a little bit oddly because, okay   these are two push out views but the color is kind  of has a priority, a higher priority than   the Spacer and yeah it does so you need to know  that the Spacer indeed is a push out to you but   when added to other push-out views it will adjust  accordingly. So it will squeeze itself to whatever   space it, you know the other push out view needs and  the color red in this case it needs all of the   space. Now there's also you can see this white line,  that's the Spacer. In some cases we don't want that.   So there's another initializer for the  Spacer and that is with the minimum length. So with   the minimum length let's just add in here 30 maybe,  that would be the minimum length of the Spacer   that would be pushed up onto from another push  out to view. In this case is 30. Some cases you just   want to the color red in this case or a text  or whatever to take up as much space as it can.   Therefore we are abandoning the default value that  the spacer has for the minimum length and setting   it to zero. Now the color red is taking up all  of the space if it needs to or if it wants to.   Of course this is optional so if you just set it  to nil then the default value will be used or   just remove the minimum length property and then  the default value will be used which is a nil and   this number is kind of a magic number from Apple,  you know it just looks great on all devices.   At rebeloper.com/mentoring I offer an exceptional  mentoring session tailored specifically to SwiftUI   enthusiasts. Whether you're a beginner looking  to grasp the fundamentals or an experienced   developer aiming to master advanced techniques  I will provide personalized support. Hands-On   training and practical insight to help you unlock  the full potential of SwiftUI. Join my mentoring   program today and embark on a transformative  journey towards becoming a proficient Swift UI   developer, the link is down in the description. Now there's another use case for the Spacer, that is   if we add a Spacer after our color and that will  just squeeze it between and most probably you know   this, it's just setting things in center. But this is so cumbersome, you know you have to add   a new view right over here. You have to change this  to the horizontal stack. So let's hit Command + Z  all the way back so we might have our initial hello  world with the globe. And this time around we are   going to take this further. I'm going to show  you why, well what to do instead of Spacer because   you know Spacer is fine but there are much better  ways of aligning our views to whatever we want to.   And let me just remove the padding because we  don't actually need that and what I'm going   to add in here is a frame. Now this is really strange. Usually don't like frames, well I do   like frames but not with custom like set values,  like constant values with the width and height.   Some cases that's okay but it really you need  to be aware how it messes around with the layout   of your SwiftUI view. But we're not going to  use width and height. We are going to use   max height right over here, max height, there we go and we're going to go with infinity and with   the frame of max height we have also the option  of alignment right over here, to be initialized   with the alignment. And then we can just choose, let just go with the top. Let's hit Command + R and   now you see we have the same result but our view is  not cluttered with the Spacer we just had a view   modifier which is really, really amazing. Now what if we wanted this, well of course if you just   moved it with the line on the bottom, it will be  on the bottom. I'm not going to add that. But what   if we wanted to move all of this to the leading part? Well with Spacers you would just need to have   a horizontal stack and then just add a Spacer  over there but with our frame we just say   max width and again use the value of infinity and then  for the alignment we are going to say it's leading.   And we are going to be put right over here our VStack is going to put right over here. And please   note that we did not actually change the our  VStack into a horizontal stack. So if we wanted   actually a VStack which we do we wouldn't need  to nest all of it inside the horizontal stack,   which again makes our code much more complicated  with the pyramid of doom and so forth. So this is   really, really amazing. Now it might be cumbersome  to just know okay now we are in max width or max   height what should we do, therefore let's just  create a simple extension for this. So let's   have an extension of a view right over here  and I'm going to create a function alignment and that will take an alignment actually and  what type of alignment? Well we need a top bottom   leading and trailing. so the default alignment  has a lot more, therefore I'm going to create   an or an alignment. So let's create a frame  alignment let's just call it frame alignment, there we go. And we will have four cases: top,  but, leading and trading, okay. So this would   be of time frame alignment, okay. It will just give us back some view, there we go.   Okay! So we just want to switch through that alignment. Switch alignment and I'm going to use   Xcode completion which is really, really handy over here. And we're going to say self dot well let   me just copy this out and adjust it accordingly. So if we are on top we want to have a max height and infinity and right over here it will be top. I'm going to hit Command + D on this line to   duplicate it at Option + Command + closing brackets to  move it down and the alignment should be a bottom. Again let's duplicate this and move it down and  make the necessary changes. In this case it would   need to have max width and the alignment would  be leading of course. Command + D, Shift + Command +  closing brackets and trailing is the alignment in this case. Now you will see that we are going   to have one warning and one error and four  of these warnings. Basically what this means is   that we are trying to return some view but we are  returning four types of views right over here.   Also we are not actually returning because we are  did not add the return keyword before all   of these, all of these four. So to make it really,  really fixable, really simple just add the at   view builder at in front of your function that  will mean that this is going to build our views   therefore it might expect different types and  yeah the view builder takes care of it all.  So now instead of frame max width you could just  say dot alignment dot let's just go for leading now.   So we can see that actually working, there we go. We have the leading and by the way this is   much more worthy, so it's a a much more as  a natural language. Let's just go for top maybe   alignment top, there we go. We have that. Of course, well actually let's just add also center   maybe in some cases you just want to set it as center. So let's add a case of center.   Let's duplicate this, there we go. Duplicate moving it down and let's have this as a center.   By the way the default alignment is center, so yeah  let's just select center also. Center, there we go. And it is centered. Of course you will  rarely use this you are going to go top,   bottom, leading, trailing in most cases and yeah  that's how you replace the Spacer. Now this is   one really good one liner that you can use  in your SwiftUI Project. Check out another   10 one-liners that I'm really, really fond  of check out the video it's right over here.
Info
Channel: Rebeloper - Rebel Developer
Views: 2,540
Rating: undefined out of 5
Keywords: swiftui, swift, xcode, spacer, swiftui spacer, swiftui basics, swiftui tutorial, swiftui frame, swiftui frame maxwidth, swiftui frame alignment, swiftui alignment guide, swiftui alignment not working, swiftui alignment top, swiftui alignmentguide example, swiftui alignment leading, swiftui alignment in zstack, swiftui alignment left, swiftui alignment right, swiftui text alignment, swiftui alignment bottom, swiftui align vstack to top, swiftui align top, rebeloper, swifui align
Id: S6bufNjIteQ
Channel Id: undefined
Length: 13min 13sec (793 seconds)
Published: Mon Sep 04 2023
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.