IluTov
IluTov

Reputation: 6862

Auto-layout and resizing views in Mac OS X

I'm trying to make a design with auto layout for Mac OS X 10.7.

My app has a window with a fixed width/height. What I really want to do is resize the controls in the window. For example, I have a search field, which should expand & collapse if it's clicked. I position a NSPathControl at the left, which should shrink if the NSSearchField expands, so they don't collapse.

Now, it works if I resize the window, but if I set the frame of the view in code, it doesn't. Autolayout simply ignores this.

I'm simply doing [[this animator] setFrame:newFrame];.

Is there something I have to enable in autolayout, or do I have to set the frame differently in code?

EDIT

I got the constraint working by setting self.translatesAutoresizingMaskIntoConstraints = YES; in the search field. I'm not sure if this is a great idea.

Furthermore it gives me the following log:

2012-12-12 19:41:30.958 Expanding Search[1428:303] Unable to simultaneously satisfy constraints:
(
    "<NSAutoresizingMaskLayoutConstraint:0x101a0d800 h=&-- v=&-- H:[ITSearchField:0x10011bb20]-(1)-|   (Names: '|':ITPathbar:0x10190a670 )>",
    "<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-|   (Names: '|':ITPathbar:0x10190a670 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-|   (Names: '|':ITPathbar:0x10190a670 )>

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens.  And/or, break on objc_exception_throw to catch this in the debugger.
2012-12-12 19:41:32.835 Expanding Search[1428:303] 74
2012-12-12 19:41:32.854 Expanding Search[1428:303] Unable to simultaneously satisfy constraints:
(
    "<NSAutoresizingMaskLayoutConstraint:0x101a0d800 h=&-- v=&-- H:[ITSearchField:0x10011bb20]-(14.5)-|   (Names: '|':ITPathbar:0x10190a670 )>",
    "<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-|   (Names: '|':ITPathbar:0x10190a670 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x10190c520 H:[ITSearchField:0x10011bb20]-(2)-|   (Names: '|':ITPathbar:0x10190a670 )>

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens.  And/or, break on objc_exception_throw to catch this in the debugger.

Upvotes: 2

Views: 3881

Answers (1)

IluTov
IluTov

Reputation: 6862

My solution


I got it, I published it on Github right here.

I also asked another, more specific question, which was solved here.


The thing is that you actually shouldn't call setFrame: when you use autolayout. You should get the right constraint and alter that. It makes it a lot easier, you can simply set the width and the frame origin is handled for you automatically.

Upvotes: 3

Related Questions