今天遇到一个奇葩的BUG,当我写了一些控件Add到一个UIView中。
运行后,在界面上点击其中的控件没有问题,但是我点击UIView空白区域时,整个UIView都变透明了,包括其中的子控件也透明了。
我猜测应该是默认的选中效果。
第一种:针对UIView中控件不需要点击事件
给UIView添加一个空的点击事件,代码如下:
uiView.AddGestureRecognizer(new UIGestureRecognizer());
运行后发现果然点击空白不会透明了,但是其中的子控件的点击事件也被屏蔽掉了。
第二种:针对一个初始界面可以显示完全的情况
出现这个问题的原因就是继承了MvxDialogViewController这个基类。所以一种方式是继承的基类换成MvxViewController。另一种方式是,我们自己写的一些view添加到Root中显示,那么我们添加的这些View作为了MvxDialogViewController中的TableView的Cell出现。框架默认的选中的style是点击后变透明,所以出现了这个bug。
解决方法:在添加完Root后遍历每一个Cell,设置他们选中的style即可,如下:
public override void ViewDidLoad()
{
base.ViewDidLoad();
TableView.SeparatorStyle = UITableViewCellSeparatorStyle.None;
Root = (RootElement)GetRoot();
//循环去掉选中效果
var cell = Root.TableView.VisibleCells[0];
cell.SelectionStyle = UITableViewCellSelectionStyle.None;
var cell1 = Root.TableView.VisibleCells[1];
cell1.SelectionStyle = UITableViewCellSelectionStyle.None;
var cell2 = Root.TableView.VisibleCells[2];
cell2.SelectionStyle = UITableViewCellSelectionStyle.None;
}
这种方式呢,从方法字面意思上可以理解出,去掉的是正在显示在界面内的View的点击效果。当我们界面足够长,初始的界面显示不完的时候,那么,下面的一些UIView的点击效果还是会透明。
第三种:针对界面足够长,也是醉好的一种解决方式
其实这篇博客一开始只有上面两种解决方式,在我开发一段时间之后,测试自己的界面时,用了上面第二种方式的界面,拉到最下面还是会出现点击透明的问题。于是经过再一次尝试,写出本解决方法。
上面提到了,继承了MvxDialogViewController后,我们添加到Root中的View作为一个Cell出现,即可以把MvxDialogViewController当成是一个UI tableView(其实他就是!因为继承了它以后要设置UITableViewStyle)。那么UITableView中有Select方法,可以设置选中的行,MvxDialogViewController肯定也有。于是试着找了一下,真的有。于是复写下面Select方法,回调点击的参数:
public override void Selected(Foundation.NSIndexPath indexPath)
{
base.Selected(indexPath);
// 根据点击的indexPath去掉选中效果
Root.TableView.CellAt(indexPath).SelectionStyle = UITableViewCellSelectionStyle.None;
}
搞定!!