[英]How do I make NSTextView grow with text?
我正在創建一個簡單的文字處理器,用戶可以在其中向NSView
添加文本框,類似於Pages中的功能。 問題在於,無論用戶輸入多少文本,添加后它都將保持相同的大小。 我希望它隨着用戶輸入文本的增長而增加,我已經嘗試過該GitHub項目,但是當我使用它時,只有在刪除所有文本后,文本字段才會擴展,好像代碼在textDidEndEditing
方法之前沒有反應。 在使用NSTextView
進行一些操作之后,我發現它更適合該任務,但是我仍然無法使其工作。 我正在運行Mavericks和Xcode 5.0.1。
希望可以有人幫幫我!
以下使用必須在代碼中創建的NSTextView子類。 由於其自身的原因,如果沒有封閉的NSScrollView實例,Xcode將不允許您在筆尖中實例化NSTextView。
此類僅允許定義文本視圖的固有高度-寬度未定義,這允許視圖隨其封閉視圖而增長。 我在NSStackView
使用了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
這個示例為我修復了這個問題: https : //developer.apple.com/library/mac/documentation/cocoa/conceptual/TextUILayer/Tasks/TextInScrollView.html
您必須將其放入NSScrollView中。 該行為與UITextView中的行為不同(如果您具有iOS背景)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.