【问题标题】:Having Draggable NSTabViewItem具有可拖动的 NSTabViewItem
【发布时间】:2013-02-05 12:45:36
【问题描述】:

是否可以提供可拖动的 NSTabViewItem,
基本上我想要什么,如果我按下 NSTabViewITem 和移动标签上的 L 按钮,我应该允许拖动 TabView 项目, 我想为 NSTabView 项目的移动做这件事,并且还有一个功能,如果用户拖动 NSTabView 项目的标签并将其移动到特定区域,那么我应该允许删除该 NSTabView 项目,

我只能找到一种拥有 PSMTab 栏的方法,但我在 NSTabView 项目上还有其他功能,如果我采用这种方法,我将丢失这些功能。

【问题讨论】:

    标签: objective-c cocoa nstableview nsview


    【解决方案1】:

    感谢您的调查, 不知怎的,我可以做到……发布一些重要的代码……

    1 -- 必须有自定义 TabView 类来处理鼠标事件。

    //接口贴在下面,

    #import <Cocoa/Cocoa.h>
    
    
    typedef enum __itemDragState{
        itemNotDragging = 0,
        itemDragStatNormal = 0,
        itemDragging    = 1,
        itemDropped     = 2
    } ItemDragStat;
    
    @protocol CustomTabViewDelegate <NSObject>
    
    @required
    -(bool)allowDrag;
    -(bool)allowDrop;
    -(void)dragEnter;
    -(void)acceptDrop;
    -(void)draggingCancelled;
    -(void)itemDropped:(id)draggedTabViewItem;
    -(void)itemDroppedCompleted:(id)droppedTabViewItem;
    @end
    
    @interface CustomTab : NSTabView{
        ItemDragStat eItemDragStat; 
        id draggedItem;
    }
    
    @property(assign)id draggedItem;
    @end
    

    现在一些重要的实现

    #import "CustomTab.h"
    #include "Log.h"
    
    @implementation CustomTab
    
    @synthesize draggedItem;
    
    - (id)initWithFrame:(NSRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code here.
        }
    
        return self;
    }
    
    # if 0
    // don't delete it, might need later on
    - (void)drawRect:(NSRect)dirtyRect
    {
        // Drawing code here.
    }
    # endif
    - (void)mouseUp:(NSEvent *)theEvent{
        log(" Mouse up ");
    
    
        NSPoint location = [self convertPoint: [theEvent locationInWindow]
                                     fromView: nil];
    
    
    
        NSTabViewItem *anItem = [self tabViewItemAtPoint: location];
    
        if ( anItem == nil ) {
            // if its mouse up else where, reject dragging regardless
            eItemDragStat = itemDragStatNormal;
            log("Item will not be dropped");
            return;
        }
    
        if ( ![anItem isEqual:[self selectedTabViewItem]]){
            log("Mouse up is in nonselected item");
    
            if ( eItemDragStat == itemDragging){
                log("Item will be dropped into this ");
    
    
                id droppedTabViewItem = anItem;
    
                if ( droppedTabViewItem && [droppedTabViewItem respondsToSelector:@selector(itemDropped:)]){
    
                    id selectedTabViewItem = [self selectedTabViewItem];
    
                    [droppedTabViewItem performSelector:@selector(itemDropped:) withObject:selectedTabViewItem];
    
                }
            }
        }
        eItemDragStat = itemDragStatNormal;
        //   return;
    
        //    [super mouseUp:theEvent];
    }
    - (void)mouseDown:(NSEvent *)theEvent{
    
        NSPoint location = [self convertPoint: [theEvent locationInWindow]
                                     fromView: nil];
    
        draggedItem = [self tabViewItemAtPoint:location];
    
        NSTabViewItem *anItem = [self tabViewItemAtPoint: location];
    
        if (anItem != nil  &&  ![anItem isEqual: [self selectedTabViewItem]])
        {
            [self selectTabViewItem: anItem];
        }
    
    
    }
    
    - (void)mouseDragged:(NSEvent *)theEvent{
    
        NSPoint location = [self convertPoint: [theEvent locationInWindow]
                                     fromView: nil];
    
    
        id tabViewItemId = [self tabViewItemAtPoint:location];
    
        NSTabViewItem *anItem = [self tabViewItemAtPoint: location];
    
        if (anItem){
            if (![anItem isEqual:draggedItem]){
    
                if (tabViewItemId && [tabViewItemId respondsToSelector:@selector(allowDrag)]){
                    eItemDragStat = itemDragging;
    
                }else{
                    // drag will be cancelled now.
                    // tell client item to stop dragging
                    if (eItemDragStat == itemDragging){
                        if ( draggedItem && [ draggedItem respondsToSelector:@selector(draggingCancelled)]){
    
                            [draggedItem performSelector:@selector(draggingCancelled)];
                            draggedItem = nil;
                        }
                        }
                    eItemDragStat = itemNotDragging;
                    // if we have +cursor then it should be reset
                }
    
            }else{
               log(" Mouse dragged");
            }
        }else{
            // dragging went elsewhere, lets close this dragging operation
            if ( draggedItem && [ draggedItem respondsToSelector:@selector(draggingCancelled)]){
    
                [draggedItem performSelector:@selector(draggingCancelled)];
                draggedItem = nil;
            }
            // here reset the mouse pointer
             eItemDragStat = itemNotDragging;
    
        }
    }
    
    @end
    

    它需要一些更精细的调整,它还在继续......

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 2011-07-19
      • 2018-01-19
      • 2011-07-22
      • 2012-01-26
      相关资源
      最近更新 更多