问题
i spend lot of time but i can not figure out how can fix this problem . I made a picker view that is appearing from bottom . it is working fine but problem is when any other event shown alert view . same time picker view come from top .
note . before alert view appear . picker view working fine . after alert view appear then piker view come to the top .
bottom appear piker view code :
extension RegistrationController {
func showSettings(selecteIndex : Int) {
//show menu
if let window = UIApplication.shared.keyWindow {
blackView.backgroundColor = UIColor(white: 0, alpha: 0.5)
blackView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleDismiss)))
window.addSubview(blackView)
window.addSubview(bottomView)
bottomView.addSubview(titlebottomView)
titlebottomView.addSubview(bottomViewActionLabel)
titlebottomView.addSubview(doneButton)
let height: CGFloat = 150
let y = window.frame.height - height
bottomView.frame = CGRect(x: 0, y: window.frame.height, width: window.frame.width, height: height)
titlebottomView.frame = CGRect(x: 0, y: 0, width: window.frame.width, height: 40)
bottomView.addSubview(pikerViewForGender)
bottomViewActionLabel.text = "Select your Gender"
bottomView.addSubview(pikerViewForGender)
pikerViewForGender.frame = CGRect(x: 0, y: 44, width: bottomView.frame.width, height: bottomView.frame.height - 40)
self.bottomViewActionLabel.frame = CGRect(x: 13, y: 0, width: 150, height: 40)
self.doneButton.frame = CGRect(x: window.frame.width - 80 , y: 0, width: 80, height: 40)
blackView.frame = window.frame
blackView.alpha = 0
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
self.blackView.alpha = 1
self.bottomView.frame = CGRect(x: 0, y: y, width: window.frame.width, height: height)
}, completion: nil)
}
}
func handleDismiss() {
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
self.blackView.alpha = 0
if let window = UIApplication.shared.keyWindow {
self.bottomView.frame = CGRect(x: 0, y: window.frame.height, width: window.frame.width, height: window.frame.height)
}
}) { (completed: Bool) in
print("good way ....")
}
}
}
alert view code :
extension UIViewController {
func showAlert(message: String ){
let alert = UIAlertController(title: "Whoops", message: message, preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: {(_ action: UIAlertAction) -> Void in
alert.dismiss(animated: true, completion: nil)
}))
self.present(alert, animated: true, completion: nil)
}
}
回答1:
Your done button is added as subview onto titlebottomView. When you see your done button up there, it means that your titlebottomView is still on your screen, not getting dismissed or brought back. So in your handleDismiss() function, use your desired way to make sure titlebottomView is in some off screen location or bring it back as best practice.
回答2:
You custom PickerView will always be on top of any other presented views because you are adding PickerView as a subview on MainWindow while you're presenting UIAlertController on current UIViewController.
Add your PickerView as a subview of current UIViewController instead of MainWindow, that will solve the problem.
If you would have used (now deprecated) UIAlertView, this problem wouldn't have occurred. But unfortunately UIAlertView is now deprecated.
And by the way, adding PickerView on MainWindow isn't a very good approach so avoid it in future.
Hope it helps!
来源:https://stackoverflow.com/questions/44612259/uialertcontroller-change-other-uiview