有没有办法使用约束自动调整NSTokenField的高度(保持宽度不变)?
-sizeToFit
应该可行,但事实并非如此。如果我设置一个约束以保持宽度不变并调用此方法,则忽略约束并仅调整宽度(当我想要的只是调整高度时)。
答案 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);
}