0

我知道 UIButton 有一个menu属性,因此可以将上下文菜单添加到按钮中。但是对于其他的 UIControl 子类,比如自定义 UIControls,这个属性是不存在的。

我知道将上下文菜单添加到 UIControl 的一种方法是调用addInteraction然后采用上下文菜单的委托。但是,如果我在页面上有多个控件,我该如何为所有不同的控件添加菜单,因为它们都共享同一个委托?

或者,如何menu向我的 UIControl 子类添加属性?我知道 UIControl 有一个名为的属性contextMenuInteraction,显然是自动填充的,但我不明白如何使用该属性。我知道控件必须实现委托方法(UIContextMenuConfiguration *)contextMenuInteraction:(UIContextMenuInteraction *)interaction configurationForMenuAtLocation:(CGPoint)location,但是在该方法中,我只是构造 UIContextMenuInteraction 对象吗?设置menu属性后,如何让它调用委托方法?

本质上,我希望能够menu在我的 UIControl 子类中模仿 UIButton 类的属性。但如果不是这样,那么我至少想弄清楚如何支持多个上下文菜单都共享同一个委托。

4

1 回答 1

1

您可以像添加新手势识别器一样创建新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
    }];

因此,如果我有一个UIControl名为的自定义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];
}
于 2021-12-18T21:53:07.473 回答