1.搜:
swift click else where dismiss menu
swift click elsewhere dismiss menu
参考:
2.搜:
swift overlay view
参考:
代码:
addDropdownView = UITableView(frame: addDropdownFrame)
addDropdownView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
addDropdownView.backgroundColor = UIColor.yellowColor()
//add border
addDropdownView.layer.masksToBounds = true
addDropdownView.layer.borderColor = UIColor.lightGrayColor().CGColor
addDropdownView.layer.borderWidth = 1.0
super.init(frame:addDropdownFrame)
addDropdownView.delegate = self
addDropdownView.dataSource = self
//self.addSubview(addDropdownView)
//self.bringSubviewToFront(addDropdownView)
// click elsewhere dismiss add dropdownlist
overlayView = UIView(frame: UIScreen.mainScreen().bounds)
overlayView.backgroundColor = UIColor.yellowColor()
overlayView.alpha = 0.6
addDropdownView.delegate = self
let tap = UITapGestureRecognizer(target: self, action: Selector("addDropdownListViewShouldDismiss"))
tap.numberOfTapsRequired = 1
overlayView.addGestureRecognizer(tap)
overlayView.addSubview(addDropdownView)
self.addSubview(overlayView)
func addDropdownListViewShouldDismiss() {
print("addDropdownListViewShouldDismiss: Overlay Tapped")
self.hidden = true
}结果不工作:

点击黄色区域,还是没有让下拉菜单消失
感觉是delegate的问题。
搜:
swift uitapgesturerecognizer not working
参考:
添加:
overlayView.userInteractionEnabled = true
结果:
好像起效果了,addDropdownListViewShouldDismiss调用到了:

但是好像我点击了2,3次,才调用到。。。
并且点击其他区域也还是进去对应字页面,没有响应到此处的tap。
加了tap.delegate和UIGestureRecognizerDelegate:
结果效果依旧:
虽然部分区域点击后,可以响应tap,但是还是需要点击三次左右才可以响应tap。
然后父view中把此view放到最前面:
self.view.addSubview(addDropdownListView)
self.view.bringSubviewToFront(addDropdownListView)问题依旧:
还是不能实现点击一次,就响应tap。
[解决过程]
1.搜:
swift multiple click response tap
参考:
2.
搜:
ios tap vs touch
参考:
后来:
把整个tap的代码,移动到主界面中:
就正常工作了:
单击一次,即可响应对应tap的函数。
3.
搜:
swift UITapGestureRecognizer super view
参考:
4.
搜:
swift super view block subview tap
参考:
5.swift superview capture subview tap
swift subview tap not capture whole screen
swift subview tap full screen
6.swift UITapGestureRecognizer pass to subview
最后用代码:
import UIKit
class MainViewController: UITabBarController, UIGestureRecognizerDelegate {
var titleLabel:UILabel!
var addDropdownListView:AddDropdownListView!
let mainTabs = ["消息", "通讯录", "文件", "收藏", "我"]
let dropdownListTitleArr = ["发起会话", "发起话题", "添加同事", "添加人脉"]
//var overlayView:UIView!
var tapRecognizer:UITapGestureRecognizer!
var searchButton:UIButton!
override func viewDidLoad() {
super.viewDidLoad()
NSLog("MainViewController viewDidLoad()")
self.view.backgroundColor = UIColor.whiteColor()
let statusView = UIView()
statusView.frame = CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), STATUS_BAR_HEIGHT)
//statusView.backgroundColor = UIColor(hexString: "#ff3333")
statusView.backgroundColor = COLOR_MAIN
self.view.addSubview(statusView)
let tabbgView = UIView()
tabbgView.frame = CGRectMake(0, 20, CGRectGetWidth(self.view.bounds), NAVI_BAR_HEIGHT)
tabbgView.backgroundColor = COLOR_MAIN
//tabbgView.backgroundColor = UIColor.blackColor()
self.view.addSubview(tabbgView)
let addMenu = UIImage(named:"add_white_24x24.png")
let addButton = UIButton()
addButton.frame = CGRectMake(self.view.bounds.width - 54, 0, 44.0, NAVI_BAR_HEIGHT)
//addButton.addTarget(self, action:"toggleAddDropdownList:", forControlEvents:UIControlEvents.TouchUpInside)
addButton.addTarget(self, action:Selector("toggleAddDropdownList"), forControlEvents:UIControlEvents.TouchUpInside)
addButton.setImage(addMenu,forState:UIControlState.Normal)
tabbgView.addSubview(addButton)
let searchImage = UIImage(named:"search_24x24.png")
let searchFrame = CGRectMake(
addButton.frame.origin.x - 44,
0,
44.0,
NAVI_BAR_HEIGHT)
searchButton = UIButton()
searchButton.frame = searchFrame
searchButton.addTarget(self, action:"jumpToSearch:", forControlEvents:UIControlEvents.TouchUpInside)
searchButton.setImage(searchImage,forState:UIControlState.Normal)
tabbgView.addSubview(searchButton)
let addDropdownWidth:CGFloat = 200
let addDropdownFrame = CGRectMake(
self.view.bounds.width - addDropdownWidth,
STATUS_BAR_HEIGHT + NAVI_BAR_HEIGHT,
addDropdownWidth,
ADD_DROPDOWN_LIST_CELL_HEIGHT * 4)
print("addDropdownFrame=\(addDropdownFrame)")
addDropdownListView = AddDropdownListView(frame:addDropdownFrame)
addDropdownListView.hidden = true
self.view.addSubview(addDropdownListView)
self.view.bringSubviewToFront(addDropdownListView)
tapRecognizer = UITapGestureRecognizer(target: self, action: Selector("toggleAddDropdownList"))
tapRecognizer.numberOfTapsRequired = 1
tapRecognizer.delegate = self
}
//toggle add drop down list
func toggleAddDropdownList(){
addDropdownListView.hidden = !addDropdownListView.hidden
if !addDropdownListView.hidden {
self.view.addGestureRecognizer(tapRecognizer)
searchButton.enabled = false
}else {
self.view.removeGestureRecognizer(tapRecognizer)
searchButton.enabled = true
}
print("addDropdownListView.hidden=\(addDropdownListView.hidden)")
}
//jump to search view
func jumpToSearch(button : UIButton){
print("realy called jumpToSearch")
}
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
print("touch=\(touch)")
print("touch.view=\(touch.view)")
//get touch/tap point/position in current (main) view
let touchPoint = touch.locationInView(self.view)
print("touchPoint=\(touchPoint)")
//check tap point in subview or not
if CGRectContainsPoint(addDropdownListView.frame, touchPoint){
// not intercept touch -> forward to subview: addDropdownListView
return false
}
else
{
// intercept touch -> forward to toggleAddDropdownList
return true
}
}
}实现了效果了:
点击其它区域后,当前弹出的,子视图,一个tableview,即可消失。
而点击到属于tableview视图范围内时,则可以正常传递touch给didSelectRowAtIndexPath
转载请注明:在路上 » [已解决]swift如何实现点击弹出菜单之外的地方让弹出菜单消失