1. 程式人生 > >MacOS 開發 - NSTextView

MacOS 開發 - NSTextView

文章目錄


NSTextView 有趣的地方很多,這裡慢慢貼


常見用法:

作為 NSScrollView 的 DocumentView


    NSScrollView *scrolleView = [[NSScrollView alloc]init];
    self.scrollView = scrolleView;
    [bgView addSubview:scrolleView];
   
//    scrolleView.contentInsets = NSEdgeInsetsMake(12, 20, 12, 20); //無效
    
    [scrolleView setHasVerticalScroller:NO];
    [scrolleView setHasHorizontalScroller:YES];  //滾動條
    
    NSTextView *txView = [[NSTextView alloc]init];
    [txView setAutoresizingMask:NSViewHeightSizable];
    txView.frame = NSMakeRect(0, 0,contentSize.width, contentSize.height);
    [txView setMinSize:contentSize];
    [txView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
   
    [txView setAutoresizingMask:NSViewWidthSizable];
    
    [[txView textContainer] setContainerSize:NSMakeSize(contentSize.width - 40, FLT_MAX)];
    [[txView textContainer] setWidthTracksTextView:YES];
    
    [txView setVerticallyResizable:YES];
    [txView setHorizontallyResizable:YES];
    
    txView.editable = NO;  //只顯示
    
    [scrolleView setDocumentView:txView];

常用屬性


設定顏色

無效

    [scrolleView msSetLayerColor:[NSColor redColor]];
    [txView msSetLayerColor:[NSColor yellowColor]];

有效

   scrolleView.backgroundColor = [NSColor redColor];
    txView.backgroundColor = [NSColor yellowColor];

使用 NSAttributedString

錯誤、崩潰

self.textView.attributedString = [[NSAttributedString alloc]initWithString:detailStr attributes:attributes];

正確

NSAttributedString *str = [[NSAttributedString alloc]initWithString:detailStr attributes:attributes];
 [self.textView.textStorage appendAttributedString:str];


NSTextView & NSTextField 比較

  • 從表面上看,前者比後者功能豐富,前者一般用作複雜的文字編輯,後者一般接受簡單的資料輸入。
  • 二者處理 Enter 和 Tab 鍵的行為不同。NSTextView 的方式和通常的編輯器相同:給編輯內容新增換行或者 tab 字元。
  • NSTextField 的方式則類似於其它非文字編輯的Cocoa 控制元件:Enter 鍵觸發 target action(預設為終止編輯),Tab 鍵令焦點移到相鄰的下一控制元件。

當一個 NSTextField 控制元件不擁有焦點的時候,它只顯示自己儲存的文字值,並不和 NSTextView 有任何關係。

當它獲得焦點時,其所在的視窗會把一個 NSTextView 控制元件置於其上,並將原來的 NSTextField 物件設定為該 NSTextView 物件的 delegate。

所以,真正獲取焦點並且成為 first responder 的控制元件是 NSTextView 物件。在同一視窗中,置於所有 NSTextField 之上的,是同一個 NSTextView 物件例項。因為只有一個控制元件能獲得焦點,所以共享單一的 NSTextView 例項沒有問題。這個唯一的例項稱為「field editor」,即放置在 text field 上的 editor。Field editor 由視窗負責建立和管理。


參考資料:

Sodas lay:NSTextField與NSTextView
http://blog.csdn.net/sodaslay/article/details/8313126