objective-c - 如何让 NSTextView 随文本一起增长?

标签 objective-c text autolayout nstextview

我正在创建一个简单的文字处理器,用户可以在其中向 NSView 添加文本框,类似于 Pages 中的功能。问题是,添加后,无论用户输入多少文本,它都会保持相同的大小。我希望它随着用户输入文本而增长,我尝试过这个 GitHub 项目,但当我使用它时,文本字段仅在我删除所有文本后才会展开,就好像代码在 textDidEndEditing 方法之前没有反应一样。在使用 NSTextView 进行一些工作后,我发现它更适合该任务,但我仍然无法使其工作。我正在运行 Mavericks 和 Xcode 5.0.1。

希望有人能帮助我!

最佳答案

以下使用必须在代码中创建的 NSTextView 子类。由于其自身的原因,Xcode 不允许您在没有封闭 NSScrollView 实例的情况下在 nib 中实例化 NSTextView。

此类仅定义 TextView 的固有高度 - 宽度未定义,这允许 View 随其封闭 View 一起增长。我在 NSStackView 中使用了它,它似乎工作得很好。试图重创 NSTextField 以便它可以包装多行文本、编辑和支持自动布局,这太困惑了。

请注意,我们支持聚焦环,因为我希望我的类表现得像 Uber 文本字段。另请注意,我们不支持边框。在我的实际使用中,我创建了一个包装自定义 TextView 的复合 View 。该包装 View 根据需要绘制边框。

@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

关于objective-c - 如何让 NSTextView 随文本一起增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20211923/

相关文章:

ios - AutoLayout 上的 UILabel sizeWithFont 不起作用

objective-c - 音乐可视化/交互应用程序的最佳方法

objective-c - 如何检查对象是否已初始化? Objective-C

iphone - 下面的属性声明有什么区别?

java - 如何使用 selenium webdriver 从一个文档中选择文本

c# - 使用 Stream writer 将特定字节写入文本文件

ios - NSMutableDictionary 中的更改未反射(reflect)在父 NSDictionary 中

iOS 7 显示带布局的文本(标题、段落...)

ios - Main.storyboard 中的 IB Designables 错误

iphone - 为什么这个自动布局规范不够用?