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