【问题标题】:How to send touch event to a UIView on iOS如何将触摸事件发送到 iOS 上的 UIView
【发布时间】:2018-09-14 09:18:08
【问题描述】:

我在视图上添加了一个点击手势。当点击视图时,会调用一个内部方法并弹出一个警报。

现在我想发送触摸事件来模拟这个视图上的手指触摸。我怎么能这样做?

================

谢谢大家。

我想我应该清楚地描述问题。我正在 iOS12 上的 ReplayKit 上工作。我们可以将 RPSystemBroadcastPickerView 添加到我们的自定义视图中。在我的项目中,单击一个按钮,RPSystemBroadcastPickerView init 并添加到我的视图中,点击 RPSystemBroadcastPickerView,选择项目,然后单击 Start Broadcast。

我想要做的是,当我点击按钮时,它会自动跳转到选择项目界面。就像点击按钮后向 RPSystemBroadcastPickerView 发送触摸事件一样。

【问题讨论】:

  • 你想让触摸事件做什么?
  • 尝试使用UIContol,可以直接设置和UIButton一样的动作

标签: ios uiview uitouch


【解决方案1】:
UIButton *btnInPicker = nil;
for( UIView *_subView in self.broadcastPicker.subviews) {
    if( [_subView isKindOfClass:[UIButton class]] ) {
        btnInPicker = (UIButton *)_subView;
        break;
    }
}


if(btnInPicker) {
    [btnInPicker sendActionsForControlEvents:UIControlEventTouchDown];
}

但它有一个问题:

开始/结束外观转换的不平衡调用

【讨论】:

    【解决方案2】:

    首先,在屏幕位置创建一个 RPSystemBroadcastPickerView 并且没有高度和宽度以不显示其图标并将其添加到您的控制器(对我来说是 topController)然后选择 RPSystemBroadcastPickerView 的最顶部视图,即按钮然后调用它action -> theBroadcastPicker 现在应该打开,无需点击屏幕

     var  broadCastPicker = RPSystemBroadcastPickerView(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
    topController.view.addSubview(broadCastPicker!)
    var tap = broadCastPicker?.subviews.first as! UIButton
    tap.sendActions(for: .touchUpInside)
    

    【讨论】:

    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
    【解决方案3】:

    您可以创建自定义视图并覆盖以下方法...

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    - (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    

    斯威夫特版本

    func touchesBegan(Set<UITouch>, with: UIEvent?)
    

    告诉这个对象一个或多个新的触摸发生在一个视图或窗口中。


    func touchesMoved(Set<UITouch>, with: UIEvent?)
    

    当与事件相关的一个或多个触摸发生变化时通知响应者。


    func touchesEnded(Set<UITouch>, with: UIEvent?)
    

    当一根或多根手指从视图或窗口中抬起时通知响应者。


    func touchesCancelled(Set<UITouch>, with: UIEvent?)
    

    在系统事件(例如系统警报)取消触摸序列时通知响应者。

    更多详情可以参考link

    【讨论】:

      【解决方案4】:

      这可能会对您有所帮助。但请记住,iOS 中的触摸机制具有复杂的结构,这段代码可能不会产生您想要的结果。

      targetView.touchesBegan(.init(), with: nil)
      targetView.touchesEnded(.init(), with: nil)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-27
        • 2011-05-07
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多