我所在的項目中,在tableview中的cell中添加button,發現當button超過tableview的可見范圍時,點擊button仍然會觸發觸摸事件。
想了下,tableview、cell與button是有父子關系的,出現這種情況可能是他們的關系在做范圍判斷時斷掉。
於是挖挖挖,在UIWidget.cpp的isClippingParentContainsPoint(const Vec2 &pt)函數中發現問題,先貼代碼:
_affectByClipping = false;
Widget* parent = getWidgetParent();
Widget* clippingParent = nullptr;
while (parent)
{
Layout* layoutParent = dynamic_cast<Layout*>(parent);
if (layoutParent)
{
if (layoutParent->isClippingEnabled())
{
_affectByClipping = true;
clippingParent = layoutParent;
break;
}
}
parent = parent->getWidgetParent();
}
這個函數是判斷是否在父控件范圍內的函數,然而,在parent = getWidgetParent();中,是通過強制轉換成Widget類型來拿到parent的,
而button的parent是tableviewcell,tableviewcell繼承自node類,而Widget類是node的子類,相當於做了一次父類轉子類的強制轉換,這當然
是不可以,所以到了這一層就斷了,從而判斷不到button是否在tableview的范圍內。
那怎么辦呢,很簡單,把getWidgetParent()換成getParent()就可以了。
把Widget* parent = getWidgetParent();換成Node* parent = getParent();
parent = parent->getWidgetParent();換成parent = parent->getParent();
目的達成。