swift初学者です。
以下のような画像を
以下のようなUIImage内で,
以下のような形で表示させたいのですが、(UIViewの縦の比率に画像の縦を合わせる)やり方が解らずに困っています。どなたかご存知の方がいらっしゃればご教授いただけないでしょうか。
コードでもstorybord上からでも構いません。
ちなみに Content Mode を Aspect Fillに設定した場合は、
以下のように出力されます。
コードは以下になります。
swift
1@IBOutlet weak var mainStackView: UIStackView! 2 @IBOutlet weak var navigationLabel: UILabel! 3 @IBOutlet weak var finishEditingButton: UIButton! //編集の終了 4 @IBOutlet weak var editPhotoView: UIView! //トリミングで残す範囲を可視化するためのUIView 5 @IBOutlet weak var headerView: UIView! 6 @IBAction func cancelButton(_ sender: Any) { 7 dismiss(animated: true, completion: nil) 8 } 9 10 var image : UIImage! 11 var imageView : UIImageView! //トリミング対象画像を表示するためのUIImageView 12 var previousImages = [UIImage]() 13 var nextImages = [UIImage]() 14 var scaleZoomedInOut : CGFloat = 1.0 //拡大・縮小した時にはUIImageViewのサイズのみが変わるので、実際のUIImageのサイズとUIImageViewとの倍率の差を記録する 15 var previousScaleZoomedInOut = [CGFloat]() 16 var nextScaleZoomedInOut = [CGFloat]() 17 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 } 22 23 override func viewDidAppear(_ animated: Bool) { 24 super.viewWillAppear(true) 25 finishEditingButton.addTarget(self, action: #selector(finishEdittingAlert), for: .touchUpInside) 26 27 editPhotoView.layer.borderColor = UIColor.black.cgColor 28 editPhotoView.layer.borderWidth = 1 29 setUpPinchInOutAndDoubleTap() 30 31 //load image and show UIImageView 32 let appDelegate = UIApplication.shared.delegate as! AppDelegate 33 image = appDelegate.photoLibraryImage 34 previousScaleZoomedInOut.append(scaleZoomedInOut) 35 createImageView(sourceImage: image, on: editPhotoView) 36 mainStackView.bringSubview(toFront: headerView) 37 } 38 39 //ピンチイン/アウト・ダブルタップの検出 40 func setUpPinchInOutAndDoubleTap(){ 41 // ピンチイン・アウトの準備 42 let pinchGetsture = UIPinchGestureRecognizer(target: self, action: #selector(pinchAction(gesture:))) 43 pinchGetsture.delegate = self as? UIGestureRecognizerDelegate 44 45 self.editPhotoView.isUserInteractionEnabled = true 46 self.editPhotoView.isMultipleTouchEnabled = true 47 48 self.editPhotoView.addGestureRecognizer(pinchGetsture) 49 // ダブルタップの準備 50 let doubleTapGesture = UITapGestureRecognizer(target: self, action:#selector(doubleTapAction(gesture:))) 51 doubleTapGesture.numberOfTapsRequired = 2 52 self.editPhotoView.addGestureRecognizer(doubleTapGesture) 53 } 54 55 //画像の全体が把握できるように、画像本体(UIImage)の幅がスクリーンの幅よりも大きい時は、画像を画面の幅に合わせたUIImageViewとして表示するという処理を施す関数 56 func createImageView(sourceImage: UIImage, on parentView: UIView){ 57 imageView = UIImageView(image: sourceImage) 58 // 画像の幅・高さの取得 59 let imageWidth = sourceImage.size.width 60 let imageHeight = sourceImage.size.height 61 let screenWidth = editPhotoView.frame.width 62 let screenHeight = editPhotoView.frame.height 63 64 if scaleZoomedInOut == 1.0{ 65 if imageWidth > screenWidth{ 66 scaleZoomedInOut = screenWidth/imageWidth 67 } 68 } 69 70 let rect:CGRect = CGRect(x:0, y:0, width:scaleZoomedInOut*imageWidth, height:scaleZoomedInOut*imageHeight) 71 imageView.frame = rect// ImageView frame をCGRectで作った矩形に合わせる 72 imageView.contentMode = .scaleAspectFill // Aspect Fill = 縦横の比率はそのままで短い辺を基準に全体を表示する 73 imageView.center = CGPoint(x:screenWidth/2, y:screenHeight/2) // 画像の中心をスクリーンの中心位置に設定 74 75 parentView.addSubview(imageView) 76 parentView.sendSubview(toBack: imageView) 77 }
ご親切にコードでもアドバイスをいただいておりますがどうしても、
横長の画像を出力する際にUIViewの縦の比率に対して画像の縦の長さに収まらずにいます。(ぴったりしない)
よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/21 07:07