Previously, I asked about using constraint layout to put two NSTableView side-by-side. Side-by-side NSTableView using StackView and Constraints Thanks to Willeke's help, I was able to achieve this using only constraints, and no StackView.
The recommendation there was:
[...] Xcode is buggy. Avoid resizing the window and/or solve layout issues by updating the frames (in Xcode 9: menu Editor -> Resolve Layout Issues -> Update Frames).
I'm still having trouble with that, unfortunately. When I run my app, it now looks fine. However, in Interface Builder, clicking "Update Frames" actually makes the layout progressively worse, such that I have to Git reset to get back to a reasonable layout. I'm worried that later, when I actually need to update my view, I will be in trouble because I am unable to touch it without breaking it.
I've tried to illustrate the issue:
I'm unsure if it's helpful, but here is my list of constraints:
What could be wrong here? Have I forgotten some obvious constraint?
Related
When I build my app Xcode gives me five warnings relating to missing constraints. But clicking on them in the Navigation Panel only takes me to a ViewController in the Storyboard and doesn't highlight which view has the problem.
In addition, as shown above, the Storyboard doesn't contain any yellow triangles at all, so I'm at a loss as to how to find which view is missing the constraints.
The errors don't appear when I run the app, so how to I try to trap these errors in the build?
(Xcode 14.2)
Xcode and Storyboards have lots of bugs...
One that you're encountering is the failure to show error/warning indicators.
This is how it should look:
Clicking that indicator will show you the specific warnings - and hovering over one shows you the view in question:
However, those indictors and descriptions are sometimes missing. Seems to happen most often when you have multiple view controllers in a single Storyboard.
You could copy each controller to a new Storyboard to see if the information shows up - but, based on my experience, it's hit-or-miss.
In your specific case, warnings such as:
Leading constraint is missing, which may cause overlapping with other views.
can be safely ignored... provided you know and understand the layout you've designed.
I have an app in the app store, FractalWorks, which is based on a very old code-base. It's a big app, with quite a few screens. It was created in Objective-C before auto-synthesized properties were a thing, to give you an idea of how long ago it was created.
I wrote the app when I had a full-time gig as an independent software developer. I've since taken a day job, and support my apps in my spare time.
It still sells fairly well, and I recently used to add a section to the Wikipedia article on the Mandelbrot set on 3D images: https://en.wikipedia.org/wiki/Mandelbrot_set#3D_images_of_Mandelbrot_and_Julia_sets
I'm fluent in Auto-Layout now, but haven't taken the time to update the app's XIB files from "struts and springs" style to Auto-Layout - nor do I want to invest the time to do so if I can possibly help it.
I want to add a minor enhancement to the app that involves adding some UI elements and making one of the windows slightly taller. The minute I try to use Interface Builder to edit my XIB, it apparently silently changes it to Auto-Layout, and then complains about "Auto Layout before OS X 10.7". (It was released to the app store for OS X version 10.4, if memory serves, and I've moved the OS version up to the lowest version I could get away with in order to support legacy customers. It currently supports ≥10.6. The original, pre app-store version used even older OS versions.)
Googling this error suggests I use the file inspector on my XIB file to un-check a "Use AutoLayout" checkbox, but I don't see any such checkbox.
What am I missing?
If I use Xcode's code review button to compare the XIB file before and after editing it, various "tool version" values are changed, as well as it gaining a setting useAutolayout="YES". Editing that to read useAutolayout="NO" does not solve the problem.
All the credit goes to matt and his comment.
1. In the Navigator (left panel) go to issue navigator and click on the error.
2. In the Inspectors panel (right panel) the Size inspector will be automatically selected. Switch Layout from Automatic to Translates Mask Into Constraints.
Update: It's called Autoresizing Mask now.
3. Repeat for every occurrence of this error.
You may end up with an error not in the Illegal Configuration group like the following which opens the All Messages view in the middle and doesn't open the Size inspector.
This is a compile time error, just build/run your app again.
And also from the previously mentioned comment:
Be careful not to make any constraints, as that will cause an incoherent situation.
If you have multiple auto layout errors, which in all likelihood you will have, select all the controls in a window and perform the operation once rather than for each individual control. Repeat for each window.
Am using Xcode 9.1 and my Xcode error while dragging objects from object panel in storyboard its mirroring automatically as shown in picture .need help in solving this !
Very odd. At first I thought it was simply rendering for a RtL locale but I don't imagine the chrome around the rendered view should be mirrored as well. Out of curiosity are you testing a Right-to-Left locale? If so, does this persist when that preference is disabled?
Otherwise I'd try cleaning the project, restarting Xcode, and removing your .xcuserdatad file, in that order.
[EDITED] After spending a couple of days on a iPad app (utility s/w for myself; not for release), I accidentally clicked on disabling size classes in Xcode (6.2). I only want to turn off Auto Layout temporarily so I could figure out why my popover scene was not rendering.
Now, all the UI elements are gone but the guidelines for both the main scene and the popover scene are still around. History seemingly shows nothing that will bring back the UI elements. I closed the Xcode project and opened it again, but only the red guidelines are visible.
Has anyone run into this? Any idea how to fix this? [EDIT] I'm referring specifically to the UI elements and getting them all back -- else I'm going to have to spend a couple of hours reconstructing and positioning them. I browsed StackOverflow and Google Search but I've not seen any relevant suggestions.
First, when disabling auto layout it will disable the size classes as well.
I would suggest that you update your Xcode to 6.3. Then that will probably be gone.
Hope that helps :)
Edit
regarding the comment
First off I would print the frames of the UIElements to see whether they are still on the screen. (Using `println("(button.frame)")
Then, if they are not there, change their frames / centres) to somewhere on the screen.
If they are in the bounds, check their sizes to make sure they are large enough to be visible. If they are then make sure they are not hidden and their alpha is 1.
In storyboard you can open the side-bar and then change the element's position in the Attributes inspector as shown here:
Every time I close and reopen XCode 6 beta 6, my previously-happy constraints are messed up and I have to click on the yellow dot to get to the "Misplaced Views" thingy, then click on each yellow triangle, choose Update Frame, and click Fix Misplacement to correct the problem. Is this a bug in the beta or have I done something wrong, perhaps? Constraints in XCode (to me, at least) are horrible things to tame at the best of times, so maybe it's not a bug?
Once fixed, and XCode neither complains about nor renders the widgets badly, it's fine. But as soon as I close then reopen the project, they're messed up again.
I have experienced the same thing on a project I'm working on. What I've observed is a circular connection among the views in the storyboard in question, so that it's possible to segue around and around a particular path or paths. The views are all embedded in a TabBarController, and each tab has its own NavigationController.
So for instance:
Activity View (programmatically selected tab), segue to ...
Detail View, segue to ...
Profile View (programmatically selected tab), segue to ...
Item View, segue to ...
Detail view
... and so on
This seems to introduce random screwups to the views.
What I have not yet done is test this by removing the circular segue paths. I'm not sure I ever will, since the circular segue paths are part of the functionality of the app. But I'm pretty sure that was about where this weird behavior got introduced. I'll be interested to hear whether the same is true of your project.