Search code examples
iosswiftxcodeuiimageuiimagepickercontroller

Image from UIImagePicker Orientation Incorrect


I'm creating a sign up page for my swift app which consists of a button that allows the user to pick a profile picture, and that picture should replace the placeholder "add picture" button once the user has selected it, by using button.setImage() with the newly selected picture. My problem is that when the user selects the picture, it's completely stretched horizontally across the screen instead of constraining to the 150x150 width and height of the button.

This is my button:

let plusPhotoButton : UIButton = {
    let b = UIButton(type: .system)
    b.imageView?.clipsToBounds = true
    b.setImage(#imageLiteral(resourceName: "plus_photo").withRenderingMode(.alwaysOriginal), for: .normal)
    b.addTarget(self, action: #selector(setProfilePic), for: .touchUpInside)
    return b
}()

I add it to the view like this:

fileprivate func setupPlusPhotoButton() {
    view.addSubview(plusPhotoButton)
    plusPhotoButton.anchor(top: view.topAnchor, paddingTop: 50, left: nil, paddingLeft: 0, right: nil, paddingRight: 0, bottom: nil, paddingBottom: 0, width: 150, height: 150)
    plusPhotoButton.anchorCenter(x: view.centerXAnchor, y: nil)
}

Using this UIView extension to make my anchoring easier:

extension UIView {
func anchor(top: NSLayoutYAxisAnchor?, paddingTop: CGFloat, left: NSLayoutXAxisAnchor?, paddingLeft: CGFloat, right: NSLayoutXAxisAnchor?, paddingRight: CGFloat, bottom: NSLayoutYAxisAnchor?, paddingBottom: CGFloat, width: CGFloat, height: CGFloat) {

    self.translatesAutoresizingMaskIntoConstraints = false

    if let top = top {
        self.topAnchor.constraint(equalTo: top, constant: paddingTop).isActive = true
    }
    if let left = left {
        self.leftAnchor.constraint(equalTo: left, constant: paddingLeft).isActive = true
    }
    if let right = right {
        self.rightAnchor.constraint(equalTo: right, constant: -paddingRight).isActive = true
    }
    if let bottom = bottom {
        self.bottomAnchor.constraint(equalTo: bottom, constant: paddingBottom).isActive = true
    }
    if width != 0 {
        self.widthAnchor.constraint(equalToConstant: width)
    }
    if height != 0 {
        self.heightAnchor.constraint(equalToConstant: height).isActive = true
    }
}

func anchorCenter(x: NSLayoutXAxisAnchor?, y: NSLayoutYAxisAnchor?) {
    self.translatesAutoresizingMaskIntoConstraints = false
    if let x = x {
        self.centerXAnchor.constraint(equalTo: x).isActive = true
    }
    if let y = y {
        self.centerYAnchor.constraint(equalTo: y).isActive = true
    }
}

}

And I present my UIImagePickerController like this:

func setProfilePic() {
    print("setting profile picture")
    let imagePickerVC = UIImagePickerController()
    imagePickerVC.delegate = self
    imagePickerVC.allowsEditing = true
    present(imagePickerVC, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
        plusPhotoButton.setImage(editedImage.withRenderingMode(.alwaysOriginal), for: .normal)
    } else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
        plusPhotoButton.setImage(originalImage.withRenderingMode(.alwaysOriginal), for: .normal)
    }

    plusPhotoButton.layer.cornerRadius = plusPhotoButton.frame.width/2
    plusPhotoButton.layer.masksToBounds = true
    plusPhotoButton.layer.borderColor = UIColor.black.cgColor
    plusPhotoButton.layer.borderWidth = 3

    dismiss(animated: true, completion: nil)
}

Any and all help is appreciated, thank you!


Solution

  • Nevermind - just checked my extension and didn't set my width constraint's isActive property to true. Duh