我想请从用户的手机图像和更新与所述图像的图像视图。
我遇到的问题是,它不会更新图像。它那里为我添加了一个断点,它击中了断点,并且图像视图可以改变形象,我手动尝试在其他地方改变它。
但是它拒绝当我需要它的工作。
我的图像视图:
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”。莫不是冲突?
试试这个,它为我工作:
DispatchQueue.main.async {
profilePictureImageView.image = croppedImage
profilePictureImageView.setNeedsDisplay()
}
从本质上讲,你需要指定要通过更新图像
profilePictureImageView.setNeedsDisplay()
你想要做的所有UI更新 - 如改变图像 - 在主线程:
if let selectedImage = selectedImageFromPicker {
DispatchQueue.main.async {
profilePictureImageView.image = selectedImage
}
}
应该这样做。
我有这个代码,我试图尽可能多地复制你的任何问题。
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)
}
}
这个问题必须由其他人在你的代码的东西引起的。我已经使用了一个懒惰的VAR一样的自己。你可以尝试简化您的代码,看看是否有用,或者发布您的代码的其余部分。什么约束你已经设置?
尝试设置modalPresentationStyle tooverCurrentContext像下面的示例
let myPickerController = UIImagePickerController()
myPickerController.delegate = self
myPickerController.sourceType = UIImagePickerControllerSourceType.photoLibrary
**myPickerController.modalPresentationStyle = .overCurrentContext**
myPickerController.delegate = self
present(myPickerController, animated: true, completion: nil)
这里有可能是有用的人另一种情况:
我有同样的问题,除了我的ImageView是在一个TableViewCell。工作是在主线程中完成的。毫无效果包括调用imageView.setNeedsDisplay()
,甚至在每一个上海华。
没有什么帮助,一些奇怪的原因,只是呼吁setNeedsLayout()
对包含ImageView的细胞。我检查的布局和所有的意见都在此调用之前和之后相同的顺序和位置。
我不知道,为什么这个工作,没有别的,所以如果任何人有任何想法,这将是非常赞赏。
我尝试过自己,现在,它的工作是去里面UITabBarController
,并为所有viewControllers
内viewDidLoad()
,而不是内部viewWillAppear()
它最初是。
一个说明,你有dispatch
做到这一点,否则,应用程序会崩溃
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.async {
self.setupViewControllers()
}
}
貌似因为分别的viewController里面viewWillAppear()
创建,在uiPicker
驳回viewControllers
将再次加载和所选择的图像将会丢失。