cocoa nsview drawrect autolayout

cocoa - Las restricciones de Autolayout no funcionan para la composición de NSView con drawRect:



(1)

Estoy tratando de aplicar restricciones de Autolayout a un botón personalizado que hereda de NSView . El botón es bastante complejo y puede usarse como botón de opción, por ejemplo. La interfaz de usuario está compuesta en drawRect: como puede adivinar a partir del siguiente fragmento de código.

@interface CustomButton : NSView

...

- (void)drawRect:(NSRect)dirtyRect { // ... if (self.hasImage) { // ... if (self.hasTitle) { // ... [image drawInRect:imgRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:fraction alignment:Alignment_LEFT]; } else { [image drawInRect:imgRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:fraction alignment:Alignment_CENTER]; } } if (self.hasTitle) { // ... [self.textRenderer drawText:m_title inRect:textRect withState:state controlView:self]; } }

Con éxito configuré un campo de texto personalizado que deriva de NSView. La diferencia es que el campo de texto usa addSubView: para componer sus componentes de interfaz de usuario.

Me pregunto si todavía es posible usar restricciones de Autolayout para posicionar los componentes de la interfaz de usuario. En el momento en que no aparece ningún componente. Tengo la sensación de que no funciona porque dibujo esas "subvistas".


Pude resolver el problema implementando el intrinsicContentSize en CustomButton .

#pragma mark - NSConstraintBasedLayoutFittingSize /** Returns a suitable size for the receiver. This settings may not apply if a layout constraint defines minimum values for the width or height of the element. @returns A size for the receiver. */ - (NSSize)intrinsicContentSize { // Calculation of width and height of the rendered text. return NSMakeSize(width, height); }