使用基于约束的布局自动调整NSTokenField的大小

时间:2013-06-17 12:21:26

标签: objective-c cocoa nstokenfield

有没有办法使用约束自动调整NSTokenField的高度(保持宽度不变)?

-sizeToFit应该可行,但事实并非如此。如果我设置一个约束以保持宽度不变并调用此方法,则忽略约束并仅调整宽度(当我想要的只是调整高度时)。

2 个答案:

答案 0 :(得分:1)

令牌字段的cellSizeForBounds方法确实返回了正确的大小,因此您可以像这样实现它(自定义子类,在Swift中):

class TagsTokenField: NSTokenField {

    override func textDidChange(notification: NSNotification) {
        super.textDidChange(notification)
        self.invalidateIntrinsicContentSize()
    }

    override var intrinsicContentSize: NSSize {
        let size = self.cell!.cellSizeForBounds(NSMakeRect(0, 0, self.bounds.size.width, 1000))
        return NSMakeSize(CGFloat(FLT_MAX), size.height)
    }

}

答案 1 :(得分:0)

基于How to let NSTextField grow with the text in auto layout?

也不要设置尺寸限制,只需让它成为。

intrinsicContentSize中的方法NSView会返回视图本身认为的内在内容大小。

NSTextField在不考虑其单元格的wraps属性的情况下计算此值,因此如果将其放在一行中,它将报告文本的尺寸。

因此,NSTokenField的自定义子类可以覆盖此方法以返回更好的值,例如单元格cellSizeForBounds:方法提供的值:

-(NSSize)intrinsicContentSize
{
    if ( ![self.cell wraps] ) {
        return [super intrinsicContentSize];
    }

    NSRect frame = [self frame];

    CGFloat width = frame.size.width;

    // Make the frame very high, while keeping the width
    frame.size.height = CGFLOAT_MAX;

    // Calculate new height within the frame
    // with practically infinite height.
    CGFloat height = [self.cell cellSizeForBounds: frame].height;

    return NSMakeSize(width, height);
}