2013-10-14 68 views
1

我正試圖建立一個應用程序,允許用戶指定圖像的多個區域,使用矩形邊界框,他們可以調整大小。拖動調整大小的NSView(或其他對象)

到目前爲止,我有一個NSScrollView,其中包含NSImageView,因此用戶可以放大圖像並按需要滾動。我目前的想法是,我可以使用NSViews作爲提供用戶可以定位和調整大小以覆蓋所需區域的邊框的方法,將NSView幀轉換爲圖像大小的百分比,然後存儲這些值供以後使用。

有一個addAreaToImage方法,將NSView添加到NSScrollView在用戶當前正在查找的任何位置的中心。 我想要的是讓用戶能夠點擊並拖動區域的角落來調整大小/將其移動到任何他們想要的位置。如果您願意,可以對活動邊界框進行排序。

閱讀完文檔後,大部分與拖動有關的東西都是關於使NSView成爲拖動別的東西(比如圖像)或調整大小的地方,因爲超級視圖被調整大小,這兩者都不是我所知道的希望去做。

我擔心的是回答這個問題(或一組答案,這將導致我能夠推出自己的解決方案)是如此基本,沒有人想過他們,這最後幾天谷歌搜索幾乎證實了我。

我來自iOS開發,所以這不是全新的領域,但NSView和UIView似乎有足夠的差異來徹底混淆我到目前爲止。

+0

嗨@Carter堡,你有沒有得到這個工作?我想做一些非常相似的事情,如果你能幫助我開始 - 我會非常感激。 –

回答

5

是的,你需要自己實現它,但它不是太複雜。

首先,您需要對您希望區域視圖的行爲和外觀做出一些決定。你需要調整大小還是能夠拖動(移動)視圖?當它們被動/拖動/調整大小/突出顯示時,它們是如何繪製的。你想要調整大小並拖動光標嗎?調整大小的行爲是什麼,只需拖動一個角落或所有邊框?什麼是拖動邊框寬度?

然後,您將您用作區域視圖的NSView進行子類化。給它一些私人成員來表明它的狀態(如isDragged,isResized等)。

執行drawRect:來繪製視圖。考慮到它的各種狀態(例如,您可能想要可視化拖動或調整大小時,繪製透明疊加層等)。

接下來,你要通過實施mouseDown:mouseDragged:mouseUp:也許mouseMoved:處理mouse events。這裏你的調整大小/拖動邏輯將被放置。檢查用戶最初在mouseDown:中點擊的位置,並確定從該點設置相關狀態的可能操作。跟進mouseDragged:以執行操作(通過相應地設置視圖的框架原點和大小)。完成mouseUp:(驗證,設置狀態,調用完成邏輯,註冊撤銷操作)中的操作

當處理積分和反應時,請不要忘記coordinate system。您需要將它們翻譯爲視圖和基本系統。 NSView具有所需的所有方法。

每次您希望視圖重繪本身以反映大小和位置的變化時,您需要致電setNeedsDisplay:setNeedsDisplayInRect:

對於視圖中需要不同光標的區域(例如,調整光標在角上的大小),您可能還想使用Tracking Areas

當拖動/調整大小時,不要忘記實現用於響應用戶拖動鼠標離開父視圖邊界的邏輯。

順便說一下,爲什麼你添加你的意見的滾動視圖?我認爲它們更適合作爲imageview(如果可能)或clipview的子視圖,以便它們可以滾動。

+0

這是一個完美的答案。謝謝... – emreoktem