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);
}