我正在尝试从用户的手机中选择一个图像,并使用所述图像更新图像视图。
我遇到的问题是它不会更新图像。当我添加断点并命中断点时,它确实到达了那里,并且图像视图可以更改图像,因为我尝试在其他地方手动更改它。
但是当我需要它的时候,它却拒绝工作。
我的图片视图:
lazy var profilePictureImageView: UIImageView = {
let imageView = UIImageView()
imageView.image = UIImage(named: "DefaultUser")
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.contentMode = .scaleAspectFill
imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSelectProfilePicture)))
imageView.isUserInteractionEnabled = true
return imageView
}()
通过在设备上选择一张照片来更新图像的代码:
import UIKit
extension ProfileVC: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func handleSelectProfilePicture() {
let picker = UIImagePickerController()
picker.delegate = self
picker.allowsEditing = true
present(picker, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
var selectedImageFromPicker: UIImage?
if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
selectedImageFromPicker = editedImage
}
else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
selectedImageFromPicker = originalImage
}
if let selectedImage = selectedImageFromPicker {
profilePictureImageView.image = selectedImage
}
dismiss(animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss(animated: true, completion: nil)
}
}
编辑我发现的一件事是,如果我在不同的VC上用不同的图像视图尝试它,它会像预期的那样工作。我能看到的两个VC之间唯一的主要区别是我希望它能工作,但不会同时扩展'UIPickerViewDelegate‘和'UIPickerViewDataSource’。会有冲突吗?
发布于 2017-05-10 09:09:22
试试这个,它对我很有效:
DispatchQueue.main.async {
profilePictureImageView.image = croppedImage
profilePictureImageView.setNeedsDisplay()
}
本质上,您需要指定您想要通过
profilePictureImageView.setNeedsDisplay()
发布于 2017-03-10 04:03:40
您希望在主线程上执行所有UI更新,例如更改图像:
if let selectedImage = selectedImageFromPicker {
DispatchQueue.main.async {
profilePictureImageView.image = selectedImage
}
}
应该做这件事。
发布于 2017-03-10 05:21:26
我对这段代码没有任何问题,我已经尽可能地复制了你的代码。
class ViewController: UIViewController {
lazy var imageView: UIImageView = {
let iView = UIImageView()
iView.contentMode = .scaleAspectFill
iView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSelectProfilePicture)))
iView.isUserInteractionEnabled = true
return iView
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(imageView)
self.imageView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint(item: imageView, attribute: .height, relatedBy: .equal, toItem: self.view, attribute: .height, multiplier: 1.0, constant: 1.0).isActive = true
NSLayoutConstraint(item: imageView, attribute: .width, relatedBy: .equal, toItem: self.view, attribute: .width, multiplier: 1.0, constant: 1.0).isActive = true
}
func handleSelectProfilePicture() {
let picker = UIImagePickerController()
picker.delegate = self
picker.allowsEditing = true
present(picker, animated: true, completion: nil)
}
}
extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
var selectedImageFromPicker: UIImage?
if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
selectedImageFromPicker = editedImage
}
else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
selectedImageFromPicker = originalImage
}
if let selectedImage = selectedImageFromPicker {
imageView.image = selectedImage
}
dismiss(animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss(animated: true, completion: nil)
}
}
这个问题一定是由代码中的其他东西引起的。我使用了一个和你一样的lazy变量。你能不能试着简化你的代码,看看它是否能工作,或者发布剩下的代码。您设置了哪些限制条件?
https://stackoverflow.com/questions/42703795
复制相似问题