我一直在寻找很长时间自己制作自定义警报视图。但没有成功。我所做的是我在故事板中的xib文件中设计一个视图并将其加载到应用程序中,但它只是像常规视图一样显示。我想要做的是使用Swift 3将此视图显示为iOS> = 8中的AlertController。我做的是
let alert = Bundle.main.loadNibNamed(“xib file to load", owner: self, options: nil)?.last as! UIView
se // showAlert(alert: alert)
func showAlert(alert: UIView){
let windows = UIApplication.shared.windows
let lastWindow = windows.last
print(lastWindow)
alert.frame = CGRect(x: 0, y: 0, width: 150, height: 300)
alert.center = self.view.center
lastWindow?.addSubview(alert)
}
func removeAlert(alert: UIView){
alert.removeFromSuperview()
}
这只是显示和隐藏视图。但我希望它像UIAlertController一样呈现。我希望背景中的所有内容都变暗,只关注这个视图。我怎样才能做到这一点。请帮我解决这个问题。
答案 0 :(得分:1)
首先,您应该永远触摸iOS上的window
。除了非常罕见的特殊情况。
您可以在.xib中创建透明或半透明背景的视图。然后,您可以定义协议以显示此视图:
protocol AlertPresenting {}
extension AlertPresenting {
func showAlert(_ onView: UIView) {
if let alert = Bundle.main.loadNibNamed("AlertView", owner: nil, options: nil)![0] as? AlertView {
alert.translatesAutoresizingMaskIntoConstraints = false
onView.addSubview(alert)
//here define constraints
onView.bringSubviewToFront(alert)
}
}
}
然后您可以在任何viewController
上使用它:
class MyViewController: UIViewController, AlertPresenting {
func someFunction() {
showAlert(onView: self.view)
}
}
警报将高于views
。
答案 1 :(得分:0)
let alert = UIAlertController(title: "Record Inserted", message:
"Record Inserted", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "Ok",
style:UIAlertAction.Style.default, handler: nil))
self.present(alert, animated: true, completion: nil)
答案 2 :(得分:0)
在具有透明背景视图的情节提要中创建一个视图控制器,然后将其显示
let storyBoard = UIStoryboard(name: "Alert", bundle: .main)
let viewController : UIViewController = storyBoard.instantiateViewController(withIdentifier: "AlertController")
customAlertController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
customAlertController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
self.present(customAlertController, animated: true, completion: nil)