2011-11-08 51 views
2

我有一個應用程序,我在這裏創建主窗口的兩個子視圖,子視圖是一個名爲Page的類,每個子視圖上放置了另一個名爲Ad的子視圖。我在頁面子視圖之間拖動廣告類。最初我只是重置了廣告類視圖的框架,但我真正想要做的是將其放置在發生NSLeftMouseUp事件的位置。在NSWindow中獲取鼠標上的子視圖的NSPoint

我這樣做的過程是在創建數組時將所有Page子視圖註冊到數組中。然後,我創建了NSWindow的一個子類,並將該類分配給IB中的主窗口。我將頁面視圖數組傳遞給這個類。

我想覆蓋sendEvent方法,檢查事件是否是NSLeftMouseDown,NSLeftMouseDragged或NSLeftMouseUp。 NSLeftMouseDown將檢查並查看是否點擊的子視圖是窗口層次結構的最深層次的子視圖 - window-> Page class-> Ad class,因爲我想移動廣告而不是頁面。我循環訪問數組,然後檢查單擊的NSView(Ad)的descendentOf方法,以查看是否枚舉了NSView(Page)的後代。 (希望有道理)。然後我拉它的框架。

在NSLeftMouseDragged中,我將光標更改爲與正在拖動的廣告相似。

在NSLeftMouseUp中,我查看了我們要將廣告移到哪個視圖。我無法弄清楚的是,如何在該視圖上獲取NSLeftMouseUp的NSPoint,我可以在窗口中獲取它,但該點的x/y將爲接收子視圖取消...我如何檢索子視圖中的NSPoint?

... 
} else if ([e type] == NSLeftMouseUp) { 

    //get which view we are going to drop the ad on 
    landingView = [[self contentView] hitTest:[e locationInWindow]]; 

    /****ui question here for Mike: 
    if the mouseup event is not on a page class, should the mouse remain the dragcursor image here or should 
    we change it back to the mouse icon and stop this process****/ 

    if ([[landingView className] isEqual:@"Page"]) { 

     //get ad rect 
     float adX = thisAdFrame.origin.x + 10.0; 
     float adY = thisAdFrame.origin.y + 20.0; 

     //get nspoint of mouse up event 
     NSPoint p = [e locationInWindow]; 

     [landingView addSubview:theSubView]; 
     [theSubView setFrame:NSMakeRect(p.x, p.y, thisAdFrame.size.width, thisAdFrame.size.height)]; 

    } 

} 
... 

回答

2

你可能想看看NSViews -convertPoint:fromView:-convertPointFromBacking:方法,如這些幫助矩形,點,等轉換成不同的座標系。

指定nilfromView:會將其從該視圖的窗口轉換。此代碼將適用於您:

NSPoint eventLocation = [theSubView convertPoint:p fromView:nil];