使用图像选择器更新 swift 中的背景图像
Update background image in swift using image picker
我只是试图让用户 select 从他们的库中获取图像,并用它替换默认背景。这一切似乎都有效,直到图像应该被替换,我被相同的默认图像卡住了。
为清楚起见:正在显示图片选择器,允许用户select 一张图片,然后它会被关闭,但不会替换背景图片。
import UIKit
class CharmanderViewController: UIViewController {
@IBOutlet weak var background: UIImageView!
@IBOutlet weak var charmander: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
background.addSubview(charmander)
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(pan(_ :)))
charmander.addGestureRecognizer(panGesture)
let scaleGesture = UIPinchGestureRecognizer(target: self, action: #selector(scale(_ :)))
charmander.addGestureRecognizer(scaleGesture)
}
@objc func scale (_ sender:UIPinchGestureRecognizer){
if let view = sender.view {
view.transform = view.transform.scaledBy(x: sender.scale, y: sender.scale)
}
sender.scale = 1.0
}
@objc func pan (_ sender:UIPanGestureRecognizer){
let translation = sender.translation(in: self.view)
if let view = sender.view {
view.center = CGPoint(x: view.center.x + translation.x,
y: view.center.y + translation.y)
}
sender.setTranslation(CGPoint.zero, in: self.view)
if sender.state == .began {
print ("drag started")
} else if sender.state == .changed {
print ("dragging")
} else if sender.state == .ended {
print ("drag ended")
}
}
@IBAction func getImage(_ sender: Any) {
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self as? UIImagePickerControllerDelegate & UINavigationControllerDelegate
imagePicker.sourceType = .photoLibrary
imagePicker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
self.present(imagePicker, animated: true, completion: nil)
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
background.image = info[UIImagePickerControllerOriginalImage] as? UIImage
dismiss(animated: true, completion: nil)
}
@IBAction func Share(_ sender: Any) {
let renderer = UIGraphicsImageRenderer (size: background.bounds.size)
let image = renderer.image { context in
background.drawHierarchy(in: background.bounds, afterScreenUpdates: true)
}
let shareViewController = UIActivityViewController(activityItems: [image], applicationActivities: [])
present (shareViewController, animated: true)
}
}
我试过使用
DispatchQueue.main.async {
updateYourUI()
}
但我不太明白如何正确编写替换图像的函数。感谢任何帮助。
尝试在文件顶部添加 UIImagePickerControllerDelegate 和 UINavigationControllerDelegate:
class CharmanderViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
并在您的 getImage() 函数中,将 imagePickerController 委托设置为自己:
@IBAction func getImage(_ sender: Any) {
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
imagePicker.mediaTypes =
UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
self.present(imagePicker, animated: true, completion: nil)
}
}
然后在您的 didFinishPickingMediaWithInfo 方法中,检查您是否可以将信息转换为 UIImage:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
guard let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage else {return}
background.image = originalImage
dismiss(animated: true, completion: nil)
}
我只是试图让用户 select 从他们的库中获取图像,并用它替换默认背景。这一切似乎都有效,直到图像应该被替换,我被相同的默认图像卡住了。
为清楚起见:正在显示图片选择器,允许用户select 一张图片,然后它会被关闭,但不会替换背景图片。
import UIKit
class CharmanderViewController: UIViewController {
@IBOutlet weak var background: UIImageView!
@IBOutlet weak var charmander: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
background.addSubview(charmander)
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(pan(_ :)))
charmander.addGestureRecognizer(panGesture)
let scaleGesture = UIPinchGestureRecognizer(target: self, action: #selector(scale(_ :)))
charmander.addGestureRecognizer(scaleGesture)
}
@objc func scale (_ sender:UIPinchGestureRecognizer){
if let view = sender.view {
view.transform = view.transform.scaledBy(x: sender.scale, y: sender.scale)
}
sender.scale = 1.0
}
@objc func pan (_ sender:UIPanGestureRecognizer){
let translation = sender.translation(in: self.view)
if let view = sender.view {
view.center = CGPoint(x: view.center.x + translation.x,
y: view.center.y + translation.y)
}
sender.setTranslation(CGPoint.zero, in: self.view)
if sender.state == .began {
print ("drag started")
} else if sender.state == .changed {
print ("dragging")
} else if sender.state == .ended {
print ("drag ended")
}
}
@IBAction func getImage(_ sender: Any) {
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self as? UIImagePickerControllerDelegate & UINavigationControllerDelegate
imagePicker.sourceType = .photoLibrary
imagePicker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
self.present(imagePicker, animated: true, completion: nil)
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
background.image = info[UIImagePickerControllerOriginalImage] as? UIImage
dismiss(animated: true, completion: nil)
}
@IBAction func Share(_ sender: Any) {
let renderer = UIGraphicsImageRenderer (size: background.bounds.size)
let image = renderer.image { context in
background.drawHierarchy(in: background.bounds, afterScreenUpdates: true)
}
let shareViewController = UIActivityViewController(activityItems: [image], applicationActivities: [])
present (shareViewController, animated: true)
}
}
我试过使用
DispatchQueue.main.async {
updateYourUI()
}
但我不太明白如何正确编写替换图像的函数。感谢任何帮助。
尝试在文件顶部添加 UIImagePickerControllerDelegate 和 UINavigationControllerDelegate:
class CharmanderViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
并在您的 getImage() 函数中,将 imagePickerController 委托设置为自己:
@IBAction func getImage(_ sender: Any) {
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
imagePicker.mediaTypes =
UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
self.present(imagePicker, animated: true, completion: nil)
}
}
然后在您的 didFinishPickingMediaWithInfo 方法中,检查您是否可以将信息转换为 UIImage:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
guard let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage else {return}
background.image = originalImage
dismiss(animated: true, completion: nil)
}