On Jan 19, 2018, at 12:36 , Jeremy Hughes <moon.rab...@virginmedia.com> wrote: > > If you add a scroll view in Interface Builder, that’s how it is set up for > you by Interface Builder. You don’t have to add an autoresizing mask or use > it to pin the document edges - because Apple has already done that for you! > So you’re confirming my view that it’s confusing.
IB doesn’t know what you intend, so this is a case where you do need to go in and change the settings to what you need. In this cases, there are 3 things to think about: 1. You need to constrain the NSScrollView to (usually) fill up the view it’s in. You can do this by turning on all 6 arrows inside the resize control in the inspector. 2. You can only edit the outer 4 arrows of the NSClipView but you generally shouldn’t change the default setting at all. 3. For a document view that scrolls vertically, turn on the 3 horizontal resize arrows, turn off the 3 vertical ones. (I was wrong before, you *do* have to turn on the center one. I believe this is different to how this worked in earlier versions of Xcode.) Because of #3, the document view height is now whatever it’s created at in IB, which by default is the same size as the clip view. You must set it to whatever you really need, in IB or later in code. For example, I created a project and put a scroll view inside the root content view. The default height was about 250, so I tried making the document view 500 instead. By putting some subviews inside this document view, I was able to see that the view scrolled correctly when the app runs. Resizing the window did what seemed to be a reasonable thing (the top left visible pixel before the resize stayed at the top left of the visible rect during the resize). All of this is exactly what I would expect, and you should be able to reproduce this behavior. > I mentioned in my follow-up email that I need to use explicit constraints in > order to avoid conflicts between autoresize constraints and the constraints > I’m adding to a subview. In order to avoid horizontal scrolling I’ve added > explicit constraints to pin the left and right edges of the “document” view > to its superview. Yep, that part is the same as #3 above. > Interface Builder complains if I don’t also add vertical constraints, so I’ve > done that, but made the bottom constraint into a placeholder (“Remove at > build time”). Your email suggests that I can also make the top constraint > into a placeholder. I’ve tried that now, and it seems to work fine. It also > makes sense :) Using placeholder constraints makes no sense to me. First of all, you need to understand that in current versions of Xcode, IB translates those resizing control arrows into constraints for you, unless you add *explicit* constraints that it regards as overriding this “free” translation. This means that those arrows are *not necessarily* honored. If you’re getting messages about missing constraints, then that means you’ve added some subview constraints that prevent the document view height constraint from being inferred. What you actually do about such messages depends on what size you want for the document view. — If you want a one-time fixed height, you should add an explicit height constraint. — If you want a fixed height (that is, not derived from the subviews by auto-layout) that changes at various times according to decisions made in code, you should add an explicit height constraint and modify the constraint at run-time. — If you want a height that is derived from the subviews, you need to add sufficient constraints within the document view, and between the document view and its child views, to satisfy auto-layout’s requirements. In this case, there should be *no* vertical constraints relating the document view to its superview. If your application is swapping subviews into the document view at run-time, then you have a couple of points to remember: — You don’t want IB to provide default constraints on the document view. You should probably write code to remove any existing constraints from the document view before you swap in new subviews. (Even if you turn off all the arrows in the IB resize control, it’s not obvious to me that IB won’t add a height constraint anyway.) — The document view’s vertical auto-layout universe is self-contained. You need to ignore the clip view or any other ancestor views, but make sure you establish a complete set of vertical constraints between the document view and its children. Whether that resizes or preserves the document view height is up to you. _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com