我知道UIButton有一个menu属性,因此可以将上下文菜单添加到按钮中。但是对于其他UIControl子类,如自定义UIControls,则不存在此属性。
我知道向UIControl添加上下文菜单的一种方法是调用addInteraction,然后为上下文菜单采用委托。但是,如果页面上有多个控件,那么如何添加所有不同控件的菜单,因为它们都共享相同的委托?
或者,如何将menu属性添加到UIControl子类中?我知道UIControl有一个名为contextMenuInteraction的属性,它显然是自动填充的,但我不知道如何使用该属性。我知道控件必须实现委托方法(UIContextMenuConfiguration *)contextMenuInteraction:(UIContextMenuInteraction *)interaction configurationForMenuAtLocation:(CGPoint)location,但是在该方法中,我只是构造UIContextMenuInteraction对象吗?当设置menu属性时,如何让它调用委托方法?
本质上,我希望能够在我的UIButton子类中模仿menu类的menu属性。但如果不是这样的话,那么我至少想弄清楚如何支持多个上下文菜单--所有这些菜单都共享同一个委托。
发布于 2021-12-18 21:53:07
您可以按照添加新手势识别器的方式,将新的UIContextMenuInteraction对象创建并添加到视图(或控件等)中。
然后,在菜单操作处理程序中,您可以获得通过.sender显示菜单的长时间按下的视图。
UIAction *someAction = [UIAction actionWithTitle:@"Some Menu Option"
image:nil
identifier:nil
handler:^(__kindof UIAction* _Nonnull action) {
// get the view that presented the context menu
UIView *v = ((UIContextMenuInteraction *)(action.sender)).view;
// do something
}];因此,如果我有一个名为MySwitch的自定义MySwitch,并且我想将其中的7个添加到堆栈视图中,为每个视图提供一个上下文菜单,我可以这样做:
for (int i = 1; i < 8; i++) {
MySwitch *v = [MySwitch new];
[v setTitle:[NSString stringWithFormat:@"Switch: %d", i]];
[v.heightAnchor constraintEqualToConstant:60.0].active = YES;
UIContextMenuInteraction *interaction = [[UIContextMenuInteraction alloc] initWithDelegate:self];
[v addInteraction:interaction];
[stack addArrangedSubview:v];
}https://stackoverflow.com/questions/70401486
复制相似问题