swift提供了自带的UIAlertController, 可以显示简单的提示框,但有时候想要在弹出框中展示更多的信息,需要自定义弹出框。
自定义的弹出框可以定义一个UIView如Mydialog,背景色可以设置半透明,里面在适当位置定义一个contentView, 背景设置为白色, 这样看上去就是一个弹出框了。ContentView中可以自己定义任何其它的空间,相当于一个新的页面。
image.png
可以给MyDialog设置一个Tap的手势事件,当点击时关闭MyDialog。测试发现当点击contentView部分时也会关闭MyDialog, 解决这个问题的办法是给tap增加一个delegate, 继承UIGestureRecognizerDelegate, 重写gestureRecognizer,在里面判断点击的view是否为父页面。
class MyDialog : UIView,UIGestureRecognizerDelegate{
let tap = UITapGestureRecognizer()
let contentView = UIView()
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.darkGray.withAlphaComponent(0.6)
tap.addTarget(self, action: #selector(dismiss))
tap.delegate = self // 设置tap手势代理,点击子视图不触发该tap事件
self.addGestureRecognizer(tap)
showContentView()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func showContentView() {
contentView.frame = CGRect(x: 50, y: 100, width: self.frame.width - 100, height: 300)
contentView.backgroundColor = UIColor.white
contentView.layer.cornerRadius = 8
contentView.clipsToBounds = true
self.addSubview(contentView)
}
@objc func dismiss() {
self.removeFromSuperview()
}
// 这里判断点子view不关闭弹出窗口
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if(touch.view == self) {
return true
} else {
return false
}
}
}
网友评论