Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用基于约束的布局自动调整NSTokenField的大小_Objective C_Cocoa_Nstokenfield - Fatal编程技术网

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

Objective c 使用基于约束的布局自动调整NSTokenField的大小,objective-c,cocoa,nstokenfield,Objective C,Cocoa,Nstokenfield,是否有任何方法可以使用约束自动调整NSTokenField的高度(保持宽度不变) -sizeToFit应该可以工作,但不能。如果我设置一个约束以保持宽度不变并调用此方法,它将忽略约束并仅调整宽度大小(当我只想调整高度大小时)。基于 也不要设定尺寸限制,随它去吧 NSView中的方法intrinsicContentSize返回视图本身认为是其内在内容大小的内容 NSTextField计算时不考虑其单元格的wrapps属性,因此如果在单行中显示文本,它将报告文本的尺寸 因此,NSTokenField

是否有任何方法可以使用约束自动调整NSTokenField的高度(保持宽度不变)

-sizeToFit
应该可以工作,但不能。如果我设置一个约束以保持宽度不变并调用此方法,它将忽略约束并仅调整宽度大小(当我只想调整高度大小时)。

基于

也不要设定尺寸限制,随它去吧

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

NSTextField
计算时不考虑其单元格的
wrapps
属性,因此如果在单行中显示文本,它将报告文本的尺寸

因此,
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);
}

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


不完全一样,cellSizeForBounds在tokenfield中返回的大小始终相同。。。此外,你还必须收听文本和更改invalidateIntrinsicContentSize@PeterLapisucellSizeForBounds并不总是返回相同的大小,至少在10.11上是这样。我已经发布了一个完整代码的答案。
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)
    }

}