ios - UIImagePickerController 从 UICollectionViewCell 中的 UIImageView 呈现

标签 ios swift uiimageview uicollectionview uiimagepickercontroller

我无法从 UIImageView 中的 UIImagePickerController 加载所选图像。 UIImageView 在点击 collectionViewCell 内的按钮时显示。在 collectionViewCell 中点击那个按钮,UIImageView 动画进入 View 。点击那个 UIImageView 会显示 uiimagepicker。 The picker dismisses fine when an image is selected, but the image does not load inside the uiimageView on picker dismiss (the placeholder image remains and is not replaced by the selected image).我的控制台没有发生崩溃或错误。感谢您的帮助!

UICollectionViewCell 类 - LoginCell

class LoginCell: UICollectionViewCell, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

lazy var createUsernameButton: UIButton = {
    let customButton = UIButton(type: .system)
    customButton.setTitle("Create Username", for: .normal)
    customButton.addTarget(self, action: #selector(animateIn), for: .touchUpInside)
    return customButton
}()

func animateIn() {
    addSubview(profileImageView)

    profileImageView.transform = CGAffineTransform.init(scaleX: 1.3, y: 1.3)
    profileImageView.alpha = 0

    UIView.animate(withDuration: 0.2) {
        self.profileImageView.alpha = 1
        self.profileImageView.transform = CGAffineTransform.identity
    }

}

    lazy var profileImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.image = UIImage(named: "avatar-bg-2x")
        imageView.addGestureRecognizer(UITapGestureRecognizer(target:self, action: #selector(handleSelectProfileImage)))
        imageView.isUserInteractionEnabled = true
        return imageView
    }()

    var loginController: LoginController?

    func handleSelectProfileImage() {
        guard let loginController = delegate as? LoginController else {
            return
        }
        loginController.showImagePicker()
    }

//.....
}

登录 Controller

class LoginController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, LoginControllerDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    weak var loginCollectionView: UICollectionView!
    var loginCell: LoginCell?

    func showImagePicker() {
        let picker = UIImagePickerController()
        picker.delegate = self
        picker.allowsEditing = true
        present(picker, animated: true, completion: nil)
    }

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

        var selectedImageFromImagePicker: UIImage?

        if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
            selectedImageFromImagePicker = editedImage
        } else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
            selectedImageFromImagePicker = originalImage
        }

        dismiss(animated: true, completion: {
            if let selectedImage = selectedImageFromImagePicker {
                self.loginCell?.profileImageView.image = selectedImage
                print("was dismissed")
            }
        })
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let loginCell = collectionView.dequeueReusableCell(withReuseIdentifier: loginCellId, for: indexPath) as! LoginCell
            loginCell.delegate = self
            return loginCell
    }
// ...
}

最佳答案

我发现了问题,您没有在主线程上更新图像。试试这个:

1.更改登录 Controller 类中的代码以匹配以下代码。

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

    var selectedImageFromImagePicker: UIImage?

    if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
        selectedImageFromImagePicker = editedImage
    } else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
        selectedImageFromImagePicker = originalImage
    }

    if let selectedImage = selectedImageFromImagePicker {
        DispatchQueue.main.async {
            self.loginCell?.profileImageView.image = selectedImage
            self.loginCollectionView.reloadData() //EDIT: add this new piece of code
        }
    }

    dismiss(animated: true, completion: nil)
}

var profileImage: UIImage?

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let loginCell = collectionView.dequeueReusableCell(withReuseIdentifier: loginCellId, for: indexPath) as! LoginCell
        loginCell.delegate = self
        loginCell.profileImageView.image = profileImage != nil ? profileImage : UIImage(named: "avatar-bg-2x")
        return loginCell
}

2. 在您的 loginCell 类中更改此代码以匹配以下代码。

lazy var profileImageView: UIImageView = {
    let imageView = UIImageView()
    //removed line here
    imageView.addGestureRecognizer(UITapGestureRecognizer(target:self, action: #selector(handleSelectProfileImage)))
    imageView.isUserInteractionEnabled = true
    return imageView
}()

关于ios - UIImagePickerController 从 UICollectionViewCell 中的 UIImageView 呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45684252/

相关文章:

ios - 从 Fabric 迁移到 Firebase 时,我应该更改 dsym 文件上传脚本吗?

ios - Xcode 8.2 使用旧版 Swift 问题

ios - 正在将 Project-Swift.h 导入 Objective-C 类...找不到文件

ios - 平滑 ImageView 中的曲线和文本

iphone - 定位 UITableViewCell 的 imageView

ios - 如何从 UIImageView 中的 "User"类获取用户图像?解析网

ios - 如何在 Swift 中以编程方式在 UILabel 中插入自定义表情符号?

ios - localized.strings 文件中的超链接 - objective-c

objective-c - Swift 桥接返回父类对象而不是派生类

ios - UICollectionView 在加载图像后调整图像大小