2016-05-30 42 views
1

我試圖實現一個用戶使用的照片剪裁工具,我堅持。我有一個UIViewimageCropper),其在頂部的UIImageViewimageToBeEdited)的(z順序逐),其包含正被裁剪的圖像。如果我現在運行應用程序,使用我的其他配置和邏輯,imageCropper就在圖像的頂部。但是,當我設置的imageToBeEditedmaskViewimageCropperimageCropper轉移的原點。在弄清了約束常量之後,我確定它正在由前導約束的確切值轉變爲更大的x,並且通過頂端約束的確切值確定更大的y。的UIView作爲maskView-起源的約束轉移常數

另一塊信息,使這個更加混亂,是我有另一個UIViewimageCropperBorder)之上(再次z次序明智)的imageCropper,僅僅充當一個可見的邊框。我將它的框架設置爲與imageCropper完全相同的框架,但它們都是應該在的位置。

我沒有制約imageCropperimageCropperBorder設置。

我的問題是爲什麼imageCropper正在移位,我該如何解決這個問題?

嘗試幾種不同的方法來創建啓用用戶,平滑移動裁剪工具後,我來到了由viewDidLoad編程抓住制約的值,然後調整的起源回到這個解決方案,簡單地創建x和y偏移imageCropperviewDidLayoutSubviews和那工作。

不過,我有建立在ViewController的視圖panGestureRecognizer。一旦我開始拖動照片(imageCropper)進行裁剪,imageCropper原點再次下移。我嘗試將偏移邏輯添加到處理識別器的函數中,但它似乎將複合變化並將幀從屏幕上發送出去。 (我重置每個收到識別器的翻譯。)

代碼:

override func viewDidLayoutSubviews() { 
    resizedImageFrame = AVMakeRectWithAspectRatioInsideRect(imageToEdit.image!.size, imageToEdit.bounds) 
    let resizedImageCenter = imageToEdit.center 
    let resizedImageX = resizedImageCenter.x - (resizedImageFrame.width/2) 
    let resizedImageY = resizedImageCenter.y - (resizedImageFrame.height/2) 
    resizedImageFrame.origin = CGPoint(x: resizedImageX, y: resizedImageY) 
    currentImageFrame = resizedImageFrame 
    imageCropperBorder.frame = resizedImageFrame 
    imageCropper.frame = CGRectOffset(resizedImageFrame, -cropperXOffset, -cropperYOffset) 
    // imageCropper.frame above is set with the offset discussed. If I set it 
    // to simply resizedImageFrame it does NOT appear where imageCropperBorder is 
} 

與往常一樣,任何幫助,將不勝感激。

回答

2

當您設置imageCropperimageView的maskView。它將使用imageView的座標系來定位imageCropper,因此對於imageCropper,點(0,0)不在ViewController的視圖的左上角,而是在imageView的左上角。

+1

我會添加設置一個視圖作爲一個maskView使其成爲該視圖的子視圖。 (我終於檢查了這個調用.superview。)另外,因爲我正在處理一個調整大小的圖像,我不得不做一些計算,並且不能像原樣那樣使用超級視圖的邊界。謝謝您的幫助。 – Amelia