Search code examples
iosswiftxcodeuiimageviewuiimagepickercontroller

How to resize UIImage ratio into view in ios swift?


I am trying to resize uiimage ratio. Right now i am getting image into square not in correct aspect ratio. If i change the width and height uiimage into pickImage.frame.size.width, pickImage.frame.size.hight then UIImage look so large.

If i set pickImage?.contentMode = .scaleAspectFit then image set its position but drop shadow is shown full image view not image picked one. Here is the screenshots of result i got enter image description here

And close button should be top left corner, here when i pick image from image picker any other position of close button image set to properly based on landscape or portrait. Here is the code i used:

   func addImage(url : URL) {

    let tag = Int(arc4random_uniform(6))
    pickImage = UIImageView()

    pickImage?.sd_setImage(with:url)
    pickImage?.sd_setShowActivityIndicatorView(true)
    pickImage?.backgroundColor = UIColor.lightGray
    pickImage?.sd_setIndicatorStyle(.gray)

    pickImage?.frame = CGRect(x: randomNumber(inRange: 
   200...Int(touchDrawview.frame.width - 200)), y: Int(getYValue(maxYValue: 
   Int(touchDrawview.frame.height - 200))), width: 200, height: 200)
    pickImage?.autoresizingMask = [.flexibleTopMargin, .flexibleHeight, 
    .flexibleRightMargin, .flexibleLeftMargin, .flexibleTopMargin, 
    .flexibleWidth]
    pickImage?.contentMode = .scaleAspectFit
    pickImage?.tag = tag
    pickImage?.isUserInteractionEnabled = true


    let imageclose = UIImage(named: "imageclose")
    closeImage = UIImageView(image : imageclose)
    closeImage?.frame = CGRect(x: 10, y: 10, width: 30, height: 30)
    closeImage?.tag = tag
    closeImage?.isHidden = true
    closeImage?.isUserInteractionEnabled = true
    pickImage?.layer.shadowColor = UIColor.white.cgColor
    pickImage?.layer.shadowOffset = CGSize(width: 0, height: 3)
    pickImage?.layer.shadowOpacity = 1
    pickImage?.layer.shadowRadius = 1.0
    pickImage?.clipsToBounds = false

    let longGuetureImage = UILongPressGestureRecognizer(target: self, action: 
   #selector(longPressImage(sender:)))
    longGuetureImage.minimumPressDuration = 0.1
    pickImage?.isUserInteractionEnabled = true
    longGuetureImage.delegate = self
    pickImage?.addGestureRecognizer(longGuetureImage)

    let panGesture = UIPanGestureRecognizer(target: self, action: 
   #selector(handlePanImage(recognizer:)))
    panGesture.delegate = self
    pickImage?.isUserInteractionEnabled = true
    pickImage?.addGestureRecognizer(panGesture)

    let tapGuetureImage = UITapGestureRecognizer(target: self, action: 
   #selector(removeImage(sender:)))
    tapGuetureImage.delegate = self
    closeImage?.addGestureRecognizer(tapGuetureImage)

    let tapGueturemainImage = UITapGestureRecognizer(target: self, action: 
    #selector(selectdragImageTap(_:)))
    tapGueturemainImage.delegate = self
    pickImage?.addGestureRecognizer(tapGueturemainImage)

    let rotate = UIRotationGestureRecognizer(target: self, action: 
   #selector(handlerotateImage(recognizer:)))
    rotate.delegate = self
    pickImage?.addGestureRecognizer(rotate)

    let pinch = UIPinchGestureRecognizer(target: self, action: 
   #selector(handlePinchImage(sender:)))
    pinch.delegate = self
    pickImage?.addGestureRecognizer(pinch)

    pickImage?.dropShadowOff()


    addPickedImage(image: pickImage!, closeimage: closeImage!,imageType : 
  PickedType.image.rawValue,imageData: url.absoluteString)

    pickImage  = nil
    closeImage = nil


   }

enter image description here


Solution

  • Try This:

    pickImage?.contentMode = .scaleAspectFill
    pickImage?.clipsToBounds = true
    

    Create a UIView with clipsToBounds = true first, apply shadow on this view and then add your pickimage and button as a subView in this view. because clipsToBounds = true stop dropping shadow on current view.