2017-08-17 6 views
0

私は今かなり長い間苦労してきました。壁紙を選択すると、iOS自体に含まれているものに似た画像の切り取りをしたいと思います。基本的に私は、ユーザーが画面のズームとアスペクト比で画像から切り取った領域を選択します(ユーザーが後で壁紙として画像を使用できるようにします)。このように:画面アスペクト比のUIImageの部分を切り取る

https://gfycat.com/TornMaleAlligatorsnappingturtle

私はUIScrollViewのとUIImageViewとのインタフェースを作成するために管理してきました:

import UIKit 

class ViewController: UIViewController, UIScrollViewDelegate { 

var scrollView: UIScrollView! 
var imageView: UIImageView! 

var croppedImage: UIImage? 

@IBOutlet weak var cropButton: UIButton! { 
    didSet{ 
     cropButton.backgroundColor = UIColor.gray 
    } 
} 


override func viewDidLoad() { 

    super.viewDidLoad() 

    let image = UIImage(named: "mountains")! 

    imageView = UIImageView(image: image) 
    imageView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size:image.size) 
    imageView.contentMode = .scaleAspectFill 

    scrollView = UIScrollView(frame: view.bounds) 
    scrollView.backgroundColor = UIColor.black 
    scrollView.contentSize = imageView.bounds.size 

    scrollView.delegate = self 

    setZoomScale() 
    //centerScrollViewContents() 

    scrollView.addSubview(imageView) 
    view.addSubview(scrollView) 
    view.bringSubview(toFront: cropButton) 

} 

func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
    return imageView 
} 

@IBAction func crop(_ sender: UIButton) { 

    let rect = CGRect(x: ?, y: ?, width: ?, height: ?) 
    let croppedCGImage = imageView.image?.cgImage?.cropping(to: rect) 
    self.croppedImage = UIImage(cgImage: croppedCGImage!) 
} 

func setZoomScale() { 
    let imageViewSize = imageView.bounds.size 
    let scrollViewSize = scrollView.bounds.size 
    //let widthScale = scrollViewSize.width/imageViewSize.width 
    let heightScale = scrollViewSize.height/imageViewSize.height 

    scrollView.minimumZoomScale = heightScale //min(widthScale, heightScale) 
    scrollView.maximumZoomScale = 3 
    scrollView.zoomScale = heightScale 

    print(heightScale) 
} 
}. 

私は何の問題をズームしないと、画像の周りにパンすることができます。問題は、ユーザーに表示される領域を表すCGRect矩形を作成する方法がわからないことです。これは、元のイメージから切り抜く領域でもあります。私の不幸から私を救うどんなアイデアも大変ありがとう!

答えて

3

snapshotImageFromMyViewこれはうまく動作しますが、私はisHiddenプロパティを介して、それらを隠していても、aswellスナップショットを取得ボタンを画面上にしている出力画像

self.btn.isHidden = true 

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 
     UIGraphicsBeginImageContextWithOptions(self.YourView.bounds.size, self.YourView.isOpaque, 0.0) 
     self.YourView.drawHierarchy(in: self.YourView.bounds, afterScreenUpdates: false) 
    let snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

} 
+0

です。 – MHCsk

+0

スクリーンショットの一部になりたくないものを隠す@MHCsk –

+0

コードの直前でself.cropButton.isHidden = trueを呼び出すが、そのボタンはまだスナップショットに表示されている。 – MHCsk

関連する問題