cocoa - 自动布局约束对于带有drawRect :的NSView合成不起作用

标签 cocoa nsview drawrect autolayout

我正在尝试申请Autolayout对继承自 NSView 的自定义按钮的约束。该按钮相当复杂,例如可以用作单选按钮。用户界面由 drawRect: 组成,您可以从以下代码摘录中猜到。

@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];
    }
}

我成功配置了一个派生自 NSView 的自定义文本字段。不同之处在于文本字段使用 addSubView: 来组成其用户界面组件。

我想知道是否仍然可以使用自动布局约束来定位用户界面组件。目前没有任何组件出现。我感觉它不起作用,因为我绘制了那些“ subview ”。

最佳答案

我通过在 CustomButton 中实现 intrinsicContentSize 成功解决了该问题。

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

关于cocoa - 自动布局约束对于带有drawRect :的NSView合成不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13029052/

相关文章:

ios - 将 UIImage 绘制为一个没有离屏渲染的圆圈

ios - 如何优化drawRect?

macos - 在 Xcode 4 中调整 NSTextField 大小以适合默认字体?

cocoa - 应该由 View 还是 Controller 负责拖动处理?

cocoa - 如何将 NSData 转换回原始文件?

objective-c - 在屏幕上的某处显示自定义 UI

swift - CALayer 的属性 isGeometryFlipped 在 macOS 上不起作用

ios - 更改 UIButton 矩形而不使用drawRect

ios - 如何开始在 mac os 的 cocoa 应用程序中处理标签?

swift - 如何在 Swift 3 中禁用 macOS TextView 替换