I have started using Xcode for the first time in a long time.
The version of Xcode is 12.
I created a new project of Swift with the interface of Storyboard instead of SwiftUI.
Then I selected Main.storyboard in the left pane of Xcode and put a UILabel onto the View Controller.
I found that there was not the "Use Auto Layout" checkbox which had been in the right pane of the Inteface Builder of old Xcode.
Where is it in the version 12 of Xcode?
Is there a way to use the auto layout system in Xcode 12?
The checkbox was removed because autolayout is now the default. Just make a constraint and it springs to life for any view(s) affected by that constraint.
A view completely untouched by constraints still uses the auto resizing mask.
There is a way to subvert that behavior for an individual view; but don't.
Related
I'm using storyboards for the first time in my app
When I close Xcode, I have 0 warnings about misplaced views or anything pertaining to my storyboard. When I restart Xcode and open the storyboard, 3 out of my 15 scenes have misplaced view warnings.
Without touching anything (other than selecting the file), I can issue a git status and see that the .storyboard file has changes. If I git diff, I see this included in multiple areas of the file:
<variation key="widthClass=compact" misplaced="YES">
<rect key="frame" x="8" y="56" width="130" height="34"/>
</variation>
If an element already had <variation key="widthClass=Compact" node, then the misplaced attribute and rect node are added.
The only thing I have to do to get the warnings to go away is click on each one, make sure "Update Frame" is selected, and click "Fix Misplacement". That fixes everything until I restart Xcode.
The basic structure of my scene is:
UIView
UICollectionView
UICollectionReusableView
UICollectionViewCell
UICollectionViewCell
UISegmentedControl
How can I prevent this from happening each time I restart?
This generally happens when you have not set the constraints properly.
Try removing all views inside the UIViewController and adding newly again along with your constraints.
Clean and run your code.
One possible reason for misplaced views is:
If you have used live views(IBDesignables) in storyboards then if you open the storyboard and quickly move to some other file before the IB has finished building all the live views then the the views get misplaced. The IB starts building the live views as soon as you view the story board in the editor. To fix the misplaced views, allow IB some time to finish building the storyboard by staying on the storyboard for few moments, and the misplaced views will get fixed.
In my case it happens for all labels / buttons with custom fonts and intrinsic (not explicitly defined) sizes. Looks like an Xcode bug.
I face the same issue before, and I suppose it's not our fault, it's just a Xcode's bug.
If your .storyboard file changed but you didn't touch anything, just select the file and select the Xcode menu Source Control -> Discard Changes in "xxxx.storyboard"..., it should be work :)
This issue is caused when you add constraints that don't fit the actual screen size at run time.
for example : if you have a UIButton with width that exceeds screen width (let's say width 600) and you add fixed width constraint to that UIButton but no leading or trailing constraints , Xcode won't give you warnings as there are no conflicts, but when you actually run the app on a device or simulator with screen width less than 600, Xcode will automatically adjust UIButton width to fit the screen width which is less than 600, causing your layout constraints to change to what fitted the screen at runtime
If you are using size classes then either your constraints are not up to the mark (according to all device type if Any-Any). If not then try to adjust the frame or constraints and check once again.
Auto layout may also cause this issue.
You will get all the information regarding the warning once you click on them.
I used to face the same problem with my previous app. What I noticed is that the size of storyboards matters here.
This is Xcode issue.
If we use storyboard of any width any height, this problem doesn't occur.
If you are using storyboards of size Compact width regular height, this issue occurs.
So try to use default storyboard sizes in Xcode
In the bottom of the storyboard we have the option to select the size class. If I change the option from wRegular hRegular to any other option I get the similar issue. I don't know the reason for this.
Try to resolve it by selecting the same size class after opening the project as you have selected before closing the project.
For example, if you have selected the size class as wCompact hRegular for iPhone and you have closed your project. After opening the project again, you will see that the size class has changed to wRegular hRegular. Because of this the view objects change. Select wCompact hRegular again to resolve the issue.
Hope it will help.
A simple fix may be to simply allow Xcode to choose constraints for you, then go back and check what it has chosen to be sure it will work for you.
In storyboard:
Select View Controller giving you problems
Resolve Auto Layout Issues (bottom right)
Selected Views: Reset to Suggested
Constraints
To check what constraints have been reset:
Select each View within controller
Constraints Inspector (top right)
scroll down and examine constraints
click to preview a regular file (not .xib or .storyboard file)
quit Xcode
run git checkout .
restart Xcode
the .storyboard file is not modified now.
First check you have implement all constraints.If all constraint are correct then delete related constraint and rebut again.
Views that are aligned using Autolayout are getting collapsed with Xcode8. If we close and reopen the storyboard or xib file, some of the views are automatically resized to 1000X1000. Is it a bug?
How can we get over it? Thanks in Advance.
Try opening your Storyboard in Xcode version that is below 8.x, maybe 7.3.x . Make sure you do not have any ambiguous constraint warnings and fix them if any. Then move on to Xcode 8 and open up your storyboard and click on Update frames. It should work.
If there are any ambiguous/improper constraints at the time of updating frames, the auto layout setup would collapse. You need to spend some time to update the auto layout constraints when migrating from Xcode 7.x to 8.
I'm using storyboards for the first time in my app
When I close Xcode, I have 0 warnings about misplaced views or anything pertaining to my storyboard. When I restart Xcode and open the storyboard, 3 out of my 15 scenes have misplaced view warnings.
Without touching anything (other than selecting the file), I can issue a git status and see that the .storyboard file has changes. If I git diff, I see this included in multiple areas of the file:
<variation key="widthClass=compact" misplaced="YES">
<rect key="frame" x="8" y="56" width="130" height="34"/>
</variation>
If an element already had <variation key="widthClass=Compact" node, then the misplaced attribute and rect node are added.
The only thing I have to do to get the warnings to go away is click on each one, make sure "Update Frame" is selected, and click "Fix Misplacement". That fixes everything until I restart Xcode.
The basic structure of my scene is:
UIView
UICollectionView
UICollectionReusableView
UICollectionViewCell
UICollectionViewCell
UISegmentedControl
How can I prevent this from happening each time I restart?
This generally happens when you have not set the constraints properly.
Try removing all views inside the UIViewController and adding newly again along with your constraints.
Clean and run your code.
One possible reason for misplaced views is:
If you have used live views(IBDesignables) in storyboards then if you open the storyboard and quickly move to some other file before the IB has finished building all the live views then the the views get misplaced. The IB starts building the live views as soon as you view the story board in the editor. To fix the misplaced views, allow IB some time to finish building the storyboard by staying on the storyboard for few moments, and the misplaced views will get fixed.
In my case it happens for all labels / buttons with custom fonts and intrinsic (not explicitly defined) sizes. Looks like an Xcode bug.
I face the same issue before, and I suppose it's not our fault, it's just a Xcode's bug.
If your .storyboard file changed but you didn't touch anything, just select the file and select the Xcode menu Source Control -> Discard Changes in "xxxx.storyboard"..., it should be work :)
This issue is caused when you add constraints that don't fit the actual screen size at run time.
for example : if you have a UIButton with width that exceeds screen width (let's say width 600) and you add fixed width constraint to that UIButton but no leading or trailing constraints , Xcode won't give you warnings as there are no conflicts, but when you actually run the app on a device or simulator with screen width less than 600, Xcode will automatically adjust UIButton width to fit the screen width which is less than 600, causing your layout constraints to change to what fitted the screen at runtime
If you are using size classes then either your constraints are not up to the mark (according to all device type if Any-Any). If not then try to adjust the frame or constraints and check once again.
Auto layout may also cause this issue.
You will get all the information regarding the warning once you click on them.
I used to face the same problem with my previous app. What I noticed is that the size of storyboards matters here.
This is Xcode issue.
If we use storyboard of any width any height, this problem doesn't occur.
If you are using storyboards of size Compact width regular height, this issue occurs.
So try to use default storyboard sizes in Xcode
In the bottom of the storyboard we have the option to select the size class. If I change the option from wRegular hRegular to any other option I get the similar issue. I don't know the reason for this.
Try to resolve it by selecting the same size class after opening the project as you have selected before closing the project.
For example, if you have selected the size class as wCompact hRegular for iPhone and you have closed your project. After opening the project again, you will see that the size class has changed to wRegular hRegular. Because of this the view objects change. Select wCompact hRegular again to resolve the issue.
Hope it will help.
A simple fix may be to simply allow Xcode to choose constraints for you, then go back and check what it has chosen to be sure it will work for you.
In storyboard:
Select View Controller giving you problems
Resolve Auto Layout Issues (bottom right)
Selected Views: Reset to Suggested
Constraints
To check what constraints have been reset:
Select each View within controller
Constraints Inspector (top right)
scroll down and examine constraints
click to preview a regular file (not .xib or .storyboard file)
quit Xcode
run git checkout .
restart Xcode
the .storyboard file is not modified now.
First check you have implement all constraints.If all constraint are correct then delete related constraint and rebut again.
I am working on Xcode 6.1.1 with Swift. I just build a test application to verify if things are working well and what I see is that, Xcode neither generates a preview nor the Main.stroryboard elements show up when I run the app on the simulator.
P.S. Main Interface is set Main.stroryboard
You probably haven't set up any constraints. Select your Storyboard interface and disable Size Classes if you do not wish to take advantage of the new feature based on constraints.
Otherwise create constraints to set up the position of your objects correctly. Your UILabel and UITextField need the Center Horizontally constraint. Then, set up the top space constraint for the UILabel and the bottom space constraint for the UITextField.
Just check "is initial view controller"in attributes inspector once
What's causing this warning in the interface builder?
Attribute Unavailable
Layout attributes relative to the layout margin on iOS versions prior to 8.0.
I'm using the XCode 6 Beta. The warnings are pointing to lines in the xml source that do not concern attributes.
Since I had already created the constraints, the answer was to click on the constraint, and then look in the Utilities bar (on the right). As shown in the picture below, click on an item and then make sure that "relative to margin" is unchecked.
When you add constraints in Xcode 6, you have the option "Constrain to margins" which create a different constraint and can't be read, for example, in Xcode 5.
Create the constraints without this options and the warnings should go away. This constraints will be available on iOS 8.
If you have already created the constraints, we can change it clicking on the constraint and editing it. When selecting the second item, you can uncheck the "Relative to margin" option (as explained in the GLee answer.
If you can't find where the warning is coming from you can use this grep to find it.
Run this in Terminal in your project directory:
grep -C 6 -nr Margin .
The 6 says how many lines of context to show before and after the match.
As per Gasper Kolenc opening the storyboard as Source Code is very useful. Here is a bit more info from my experience fixing this problem:
In the storyboard source code search for "margin".You will see a line such as this.
constraint firstAttribute="trailingMargin" secondItem="Pgb-8w-IHT" secondAttribute="trailing" constant="8" id="nKP-uZ-7Xm"/
Find the id of one of the attributes (Pgb-8w-IHT in the example above).
Scroll up to find in which object this constraint belongs. Something like:
tableViewCell contentMode="scaleToFill" selectionStyle="default"
Switch back to storyboard view and show the identity inspector window.
Search through the subviews of the object you found above to find the id (Pgb-8w-IHT) on the identity inspector.
Once found inspect the constraints to find the one that needs to be deleted and recreated without the constrain to margins option selected (use the constant=" " as a hint".
In my case, I had to uncheck the "Use Auto Layout" from my storyboard in the File Inspector, and redo all the constraints in my app, the old way with that shrinking / enlarging red rectangle.
Size Classes were already disabled and the target is IOS 7.1.
But think well if you have too many View Controllers, and had already made all your constraints. When you disable auto layout, Xcode clears all the automatic constraints and reverts to the old model. Then you have to do all the job again.
This was the only way I get rid of that Attribute Unavailable warning.