我正在创建一个简单的文字处理器,用户可以在NSView
中添加文本框,类似于Pages中的功能。问题是,当它被添加时,无论用户输入多少文本,它都将保持相同的大小。我希望它随着用户输入文本而增长,我已尝试使用此 GitHub 项目但是当我使用它时,文本字段仅在我删除所有文本时展开,就像代码在之前没有做出反应一样textDidEndEditing
方法。在与NSTextView
合作之后,我发现它更适合这项任务,但我仍然无法使其发挥作用。我正在运行Mavericks和Xcode 5.0.1。
答案 0 :(得分:2)
以下使用必须在代码中创建的NSTextView子类。由于它自己的Xcode不允许你在没有封闭的NSScrollView实例的情况下在nib中实例化NSTextView。
此类允许仅定义文本视图固有高度 - 宽度未定义,允许视图随其封闭视图增长。我在NSStackView
中使用了它,它似乎运行良好。试图打击NSTextField以便它可以包装多行文本,编辑和支持自动布局太乱了。
注意我们支持聚焦环,因为我希望我的课程表现得像Uber文本字段。另请注意,我们不支持边界。在我的实际使用中,我创建了一个包装自定义文本视图的复合视图。此包装器视图根据需要绘制边框。
@interface BPTextViewField : NSTextView
// primitives
@property (assign, nonatomic) CGFloat borderOffsetX;
@property (assign, nonatomic) CGFloat borderOffsetY;
@end
@implementation BPTextViewField
#pragma mark -
#pragma mark Life cycle
- (instancetype)initWithFrame:(NSRect)frameRect textContainer:(nullable NSTextContainer *)container
{
self = [super initWithFrame:frameRect textContainer:container];
if (self) {
[self commonInit];
}
return self;
}
- (nullable instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
[self commonInit];
}
return self;
}
- (void)commonInit
{
_borderOffsetX = 1;
_borderOffsetY = 3;
self.usesFontPanel = NO;
self.usesFindPanel = NO;
}
#pragma mark -
#pragma mark Auto layout
- (NSSize)intrinsicContentSize
{
NSTextContainer* textContainer = [self textContainer];
NSLayoutManager* layoutManager = [self layoutManager];
[layoutManager ensureLayoutForTextContainer: textContainer];
NSSize size = [layoutManager usedRectForTextContainer: textContainer].size;
return NSMakeSize(NSViewNoIntrinsicMetric, size.height);
}
#pragma mark -
#pragma mark Accessors
- (void)setString:(NSString *)string
{
[super setString:string];
[self invalidateIntrinsicContentSize];
}
#pragma mark -
#pragma mark Text change notifications
- (void)didChangeText
{
[super didChangeText];
[self invalidateIntrinsicContentSize];
}
#pragma mark -
#pragma mark Drawing
- (void)drawRect:(NSRect)rect
{
[super drawRect:rect];
}
#pragma mark -
#pragma mark Focus ring
- (void)drawFocusRingMask
{
if (self.editable) {
NSRectFill(self.focusRingMaskBounds);
}
}
- (NSRect)focusRingMaskBounds {
NSRect r = [self bounds];
return NSMakeRect(r.origin.x - self.borderOffsetX, r.origin.y - self.borderOffsetY, r.size.width + self.borderOffsetX * 2, r.size.height + self.borderOffsetY * 2);
}
@end
答案 1 :(得分:0)
您必须将其放入NSScrollView中。行为与UITextView中的行为不同(如果您有iOS背景)。