Home > Mobile >  How to make UIAlertController compatible for iPad as well as iPhones using Swift
How to make UIAlertController compatible for iPad as well as iPhones using Swift

Time:12-27

I have created a Image Picker UI where I want to do selection when user clicked on the button, I have done it using UIAlertController and when I test it in iPhone then it works perfect but, when I test it in iPad then after button Clicked, the app crashed.

How do I make the UIAlertController compatible for iPad also?

CodePudding user response:

Extension for UIViewController

  extension UIViewController{
            public func addAlertForiPad(alert: UIAlertController) {
                if let alertController = alert.popoverPresentationController {
                    alertController.sourceView = view
                    alertController.sourceRect = CGRect(x: view.bounds.midX, y: view.bounds.midY, width: 0, height: 0)
                    alertController.permittedArrowDirections = []
                }
            }
        }

Usages

    let alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .actionSheet)
    
      if UIDevice.current.userInterfaceIdiom == .pad {
           addAlertForiPad(alert: alertController)
       }

      alertController.popoverPresentationController?.sourceView = view

      alertController.addAction(UIAlertAction(title: "Approve", style: .default , handler:{ (UIAlertAction)in
           print("User click Approve button")
       }))
                    
      alertController.addAction(UIAlertAction(title: "Dismiss", style: .cancel, handler:{ (UIAlertAction)in
                        print("User click Dismiss button")
       }))
                
      present(alertController, animated: true, completion: nil)

CodePudding user response:

On an iPad a uialertcontroller must be shown relative to some other controller because you can’t just show it “anywhere on the screen”.

CodePudding user response:

We can use

let ac = UIAlertController(title: nil, message: nil, preferredStyle: UIDevice.current.userInterfaceIdiom == .pad ? .alert : .actionSheet)

Full Code in swift

   @IBAction func pickBTN(_ sender: UIButton) {


    let ac = UIAlertController(title: nil, message: nil, preferredStyle: UIDevice.current.userInterfaceIdiom == .pad ? .alert : .actionSheet)

 
    ac.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { action in
        self.gallery()
    }))
    ac.addAction(UIAlertAction(title: "Camera", style: .default, handler: { action in
        self.camera()
    }))
    ac.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { action in

    }))
    
    present(ac, animated: true)


}

Functions that are used in above code (for camera & Gallery)

func gallery (){
    imagePicker.allowsEditing = false
    imagePicker.sourceType = .savedPhotosAlbum
    present(imagePicker, animated: true, completion: nil)
}

func camera (){
    imagePicker.allowsEditing = false
    imagePicker.sourceType = .camera
    present(imagePicker, animated: true, completion: nil)
}
  • Related