2017-08-09 8 views
1

私はNSTableViewを持っていて、各テーブル行にはNSTextViewがあります。私はストーリーボードのNSTextViewでスクロールを無効にしました。 NSTableViewをスクロールすることはできますが、マウスカーソルがNSTextViewの上にくると、スクロールが停止します。これは、NSTextViewがスクロールの動作をインターセプトしているためです。NSTableView内のNSTextViewブロックスクロール

NSTextViewに矢印ポイント:

Arrow points to the NSTextView

NSTextViewは、サブクラス化NSTableViewCellであることに留意してください。

class AnnouncementsVC: NSViewController, NSTableViewDelegate, NSTableViewDataSource { 
    @IBOutlet weak var tableView: NSTableView! 

    override func viewDidLoad() { 
    //... 
    } 
    func numberOfRows(in tableView: NSTableView) -> Int { 
    //... 
    } 
    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { 
    //... 
    } 
} 

class AnnouncementTableCell: NSTableCellView{ 
    @IBOutlet weak var message: NSTextView! 
} 

どのように私はNSTextViewが親NSTableViewまでのスクロールイベントを渡す作るのですか?私の推測では、scrollWheel(with event: NSEvent)が必要ですが、私は2つの異なるクラスがあるので、どこに行くのか分かりません。

+0

'NSTextView'が必要か、複数行の' NSTextField'を使用できますか? – Willeke

+0

'NSTextView'を選択して、行の高さを調整できました。私は 'NSTextField'を使用して、代わりに属性付きの文字列を使うことができると思います。 –

答えて

0

NSScrollViewをサブクラス化し、条件付きで(1)必要に応じてサブクラスインスタンスのスクロールイベントを消費するか、または(2)インスタンスに基づいてスクロールビューを囲むスクロールビューに転送するのがscrollWheel:です現在のスクロール位置。ここで

は、私が過去に使用したかなり初歩的な実装(OBJの-C)です:

- (void)scrollWheel:(NSEvent *)e { 


    if(self.enclosingScrollView) { 

     NSSize 
     contSize = self.contentSize, 
     docSize = [self.documentView bounds].size, 
     scrollSize = NSMakeSize(MAX(docSize.width - contSize.width, 0.0f), 
           MAX(docSize.height - contSize.height,0.0f)); 

     NSPoint 
     scrollPos = self.documentVisibleRect.origin, 
     normPos = NSMakePoint(scrollSize.width ? scrollPos.x/scrollSize.width : 0.0, 
           scrollSize.height ? scrollPos.y/scrollSize.height : 0.0); 

     if(((NSView*)self.documentView).isFlipped) normPos.y = 1.0 - normPos.y; 

     if( (e.scrollingDeltaX>0.0f && normPos.x>0.0f) 
      || (e.scrollingDeltaX<0.0f && normPos.x<1.0f) 
      || (e.scrollingDeltaY<0.0f && normPos.y>0.0f) 
      || (e.scrollingDeltaY>0.0f && normPos.y<1.0f)) { 

      [super scrollWheel:e]; 

     } 
     else 

      [self.nextResponder scrollWheel:e]; 

    } 
    else 
     // Don't bother when not nested inside another NSScrollView 
     [super scrollWheel:e]; 
} 

それはまだindependantly DELTAXとdeltaY移動コンポーネントを取り扱うように、まだ十分とは言えないが、おそらくそれはですあなたの場合には十分です。