I have a button in 1st ViewController(ViewControllerA) on button click I have presented another viewController(ViewControllerB)(for pop UP , modalPresentationStyle is overCurrentContext) in this view controller I have logic to pick an image. Everything is working fine but when I Picked Image it dismissing both viewController and ImagePickerController.how to solve this?
//Presentin PopUPViewController from 1st view controller
//ViewControllerA.swift
let vc = storyboard?.instantiateViewController(withIdentifier: "VehicleDetailsViewController") as! VehicleDetailsViewController
vc.modalPresentationStyle = .overCurrentContext
present(vc, animated: true, completion: nil)
//imagePickerControllerDelegate method
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
self.vehiclePhoto.image = pickedImage
self.vehiclePhoto.contentMode = .scaleAspectFill
dismiss(animated: true, completion: nil)
}
Related
I am trying to dismiss the view. I have been able to add a target to the button which brings up an action sheet that let's user choose their photo from the library. However after I "choose" an image the view doesn't get dismissed.
Here is what's inside my the didFinishPickingMediaWithInfo:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
var chosenImage = UIImage()
chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
profileImageView.image = chosenImage
// This doesn't work...
self.window?.rootViewController?.dismiss(animated: true, completion: nil)
print("Should dismiss")
}
I present the alertController like this:
self.window?.rootViewController?.present(alertController, animated: true, completion: nil)
You are presenting and dismissing the UIImagePickerController correctly. The issue must be with how you are presenting it and which view controller is on the top of the stack when you dismiss it. Try presenting it on the current ViewController that contains the delegate.
So I am inside a navigation controller and would like to present an image picker upon a button press. That works fine, but when I dismiss the picker it throws me back to the root view controller, and not where I want to process the image.
This is my code:
#IBAction func attachPhotoButtonPressed(sender: UIButton) {
imagePicker.sourceType = .SavedPhotosAlbum
presentViewController(imagePicker, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
print("Success")
} else{
print("Something went wrong")
}
self.dismissViewControllerAnimated(true, completion: nil)
}
I already looked at these questions, but didn't find a fix. (Not an objective-C guy)
Pushing a navigation controller is not supported- performing segues
presenting ViewController with NavigationViewController swift
Pushing a navigation controller is not supported
The reason that you're bouncing to the root view controller is because this line
self.dismissViewControllerAnimated(true, completion: nil)
is dismissing the parent view (self), and not the picker view. So assuming that you have a reference to your picker, then you should be calling
picker.dismissViewControllerAnimated(true, completion: nil)
I just had the same problem as you and I'm doing this as an alternative :
// Custom class : see below.
private let imagePicker = ImagePickerViewCustomController()
#IBAction func openPicker(_ sender: Any) {
// Hide the navigation bar when the picker is opened
navigationController!.setNavigationBarHidden(true, animated: false)
// Add it as a subview
addChild(imagePicker)
view.addSubview(imagePicker.view)
}
I have a subclass of UIImagePickerController that hides the status bar.
The content of the scrollView in the picker scroll over the status bar otherwise.
class ImagePickerViewCustomController: UIImagePickerController {
override func viewDidLoad() {
super.viewDidLoad()
UIApplication.shared.isStatusBarHidden = true
}
}
And finally handle delegate methods by dismissing the picker by this way :
extension UIViewController : UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
dismissPicker(picker: picker)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismissPicker(picker: picker)
}
private func dismissPicker(picker : UIImagePickerController){
picker.view!.removeFromSuperview()
picker.removeFromParent()
navigationController?.setNavigationBarHidden(false, animated: false)
UIApplication.shared.isStatusBarHidden = false
}
}
I am trying to make an image uploader on my ios app.
EDIT 7
This question is now more clearly asked here: Present Modal for Image Select Erases UI
END OF EDIT 7
The first thing I am trying to do is enable the user to select an image that they want for upload.
EDIT 6
I have simplified all the code to simply one button press. The Modal presentation deletes the previous page's UI. How I prevent this.
import UIKit
class AddImageToStandViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
#IBAction func loadImageButtonTapped(sender: UIButton) {
let imagePicker = UIImagePickerController()
imagePicker.allowsEditing = false
imagePicker.sourceType = .PhotoLibrary
self.presentViewController(imagePicker, animated: true, completion: nil)
}
}
I have found that the selection works just fine and does not destroy the UI if I push/segue from a different to this controller.
END OF EDIT 6
Below this is the other methods that I have tried before this
So far, this code enables a user to press a button and choose a photo from their photos. But, after they click the photo it just returns them to an empty View except the navbar at the bottom.
It seems my user is being returned, not to the view that they came from, but to a separate empty view. How do I return the user to the view that they came from?
import UIKit
class CreateStandViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
#IBOutlet var image: UIImageView!
...
#IBAction func selectPicture(sender: AnyObject) {
let ImagePicker = UIImagePickerController()
ImagePicker.delegate = self
ImagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
self.presentViewController(ImagePicker, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
image.image = info[UIImagePickerControllerOriginalImage] as? UIImage
self.dismissViewControllerAnimated(true, completion: nil)
}
...
let me know if there is any more information that I should give.
EDIT 1
this code has the same effect
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
image.image = info[UIImagePickerControllerOriginalImage] as? UIImage
picker.dismissViewControllerAnimated(true, completion: nil)
}
I have tried adding this line below but I get an error stating that CreateStandViewController.Type cannot be converted to the expected UIViewController.
self.presentViewController(CreateStandViewController, animated: true, completion: nil)
EDIT 2
This code below doesnt error but also changes nothing
let createStandController = CreateStandViewController()
self.presentViewController(createStandController, animated: true, completion: nil)
EDIT 3
I have literally copied all the code from here: http://www.codingexplorer.com/choosing-images-with-uiimagepickercontroller-in-swift/ and now have:
import UIKit
class CreateStandViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
#IBOutlet var imageView: UIImageView!
let imagePicker = UIImagePickerController()
#IBAction func loadImageButtonTapped(sender: UIButton) {
imagePicker.allowsEditing = false
imagePicker.sourceType = .PhotoLibrary
presentViewController(imagePicker, animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
imagePicker.delegate = self
}
// MARK: - UIImagePickerControllerDelegate Methods
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
imageView.contentMode = .ScaleAspectFit
imageView.image = pickedImage
}
dismissViewControllerAnimated(true, completion: nil)
}
func imagePickerControllerDidCancel(picker: UIImagePickerController) {
dismissViewControllerAnimated(true, completion: nil)
}
}
This has the same issue as before. When the image is selected I am sent back to a view that is white with the navbar at the bottom.
EDIT 4
I have run the same code in its own separate project as a stand alone view controller and it works. There is some code that I have in the background of my app that is killing the functionality of the code (maybe). I am guessing it may have something to do with the navbar?
EDIT 5
I removed the tab bar at the bottom by seguing to the image selecting view via a present Modally segue, but it had no effect.
Just replace your
self.dismissViewControllerAnimated(true, completion: nil)
with
picker.dismissViewControllerAnimated(true, completion: nil)
I think you will get the point after that
I am working on a project that uses tabbar system. One of the item of tabbar is JobPostingViewController. I Embed it in UINavigationController. There is a UIButton called add new job in this view controller .I implemented pushviewcontroller to go CreateJobPostViewController. There I need to add UIImagePickerController to choose the image. When i tap done button or choose an image from library it dismisses to JobPostingViewController. But it should go to the CreateJobPostViewController.
Any one please help me. Thanks in advance.
You can see the issue here:
Code in JobPostingViewController
#IBAction func openCreateJob(sender: AnyObject) {
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("CreateJobPostViewController") as! CreateJobPostViewController
self.navigationController?.pushViewController(vc, animated: true)
}
Code in CreateJobPostViewController
#IBAction func addImages(sender: AnyObject) {
imagePicker.allowsEditing = false
imagePicker.sourceType = .PhotoLibrary
presentViewController(imagePicker, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
picker.dismissViewControllerAnimated(true, completion: nil)
}
func imagePickerControllerDidCancel(picker: UIImagePickerController) {
picker.dismissViewControllerAnimated(true, completion: nil)
}
Fixed the issue by setting the image picker's modalPresentationStyle to "OverCurrentContext":
picker.modalPresentationStyle = .overCurrentContext
Adding Picker as subview
try to add the imagepicker as a subview to your CreateJobPostViewController insted of presenting it and then remove it from parent in the delegtes
#IBAction func openCreateJob(sender: AnyObject) {
var picker: UIImagePickerController = UIImagePickerController()
picker.delegate = self
picker.allowsEditing = false
picker.sourceType = .PhotoLibrary
self.addChildViewController(picker)
picker.didMoveToParentViewController(self)
self.view!.addSubview(picker.view!)
}
and then
func imagePickerControllerDidCancel(picker: UIImagePickerController) {
picker.view!.removeFromSuperview()
picker.removeFromParentViewController()
}
For presenting
showing picker over currentcontext with options like edit cancel choose,
use picker.modalPresentationStyle = .overCurrentContext //before presenting
it
presentViewController(picker, animated: true, completion: nil)
You could use:
picker.modalPresentationStyle = .overCurrentContext
but depending on your screen layout, it may be better to use:
picker.modalPresentationStyle = .overFullScreen
otherwise your "cancel", "retake" and "use photo" buttons may not be visible.
I had this same problem, I solved it using the storyboard (Xcode v9.2)
1 - Go to the storyboard, where is your ViewController, select it
2 - Set Presentation as: Current Context
Note: If it does not work Current Context, select Over Current Context
I was trying to present the picker over an iOS 13 popover view controller. To stop the camera from dismissing my popover view controller I had to change the picker's modalPresentationStyle to popover. See below:
picker.modalPresentationStyle = .popover
I have a Tab Bar Controller that presents a NavigationController. In one of the ViewControllers I push on top of this I add the imagePickerController to select a photo. When I cancel or select a picture the tab bar disappears... I tried to look for answers but I could not find one that referenced my specific issue.
Here is my Image Picker Method
#IBAction func attachImageBtnTapped(sender: AnyObject) {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary){
imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
imagePicker.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
self.presentViewController(imagePicker, animated: true, completion: nil)
}
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
attachImageBtn.backgroundColor = UIColor.greenColor()
dismissViewControllerAnimated(true, completion: nil)
}
How can I avoid this? I tried to see if I had set the tabar to be hidden somewhere like in viewWillAppear but No.
Any ideas, any help would be very much appreciated !
I found the error, I need to present the imagePicker Controller 'OverCurrentContext'.
#IBAction func attachImageBtnTapped(sender: AnyObject) {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary){
imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
imagePicker.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
self.presentViewController(imagePicker, animated: true, completion: nil)
}
}