【问题标题】:Xamarin.Forms TapGestureRecognizer not working in IOSXamarin.Forms TapGestureRecognizer 在 IOS 中不起作用
【发布时间】:2022-01-20 03:29:10
【问题描述】:

我使用 TapGestureRecognizer 已经有一段时间了,我从一开始就遇到了这个问题(我第一次在 IOS 设备上测试应用程序时,由于某种原因我在运行模拟器时遇到了问题,所以我一直在使用一个物理 IOS 设备(iPhone 12 Pro Max)),似乎我的 TapGestureRecognizer 没有在 IOS 设备上被触发。在 UWP 上(我主要测试它是最快的)我可以在我的应用程序上的选项卡等之间切换(我对所有按钮都使用 TapGestureRecognizer)。

这是我能够在 UWP 中使用按钮但不能在 IOS 上使用按钮的更简单示例之一。

XAML:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="fotbal.Oblibene" xmlns:viewModel="clr-namespace:fotbal;assembly=fotbal" xmlns:fotbal="clr-namespace:fotbal">
    <Grid x:Name="Menu_Grid" />
</ContentPage>

CS:

Menu_Grid.ColumnSpacing = 30;

Menu_Grid.Margin = new Thickness(15, 0, 0, 0);

for (int i = 0; i < 5; i++) Menu_Grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
Menu_Grid.RowDefinitions.Add(new RowDefinition());

var page_switcher_tap_recognizer = new TapGestureRecognizer();
page_switcher_tap_recognizer.Tapped += (sender, e) =>
{
    tab_switcher(sender, Menu_Grid, Oblibene_ScrollView);
};

int j = 0;
            foreach (KeyValuePair<string, string> kvp in oblibene_categories)
            {
                Grid grid = new Grid
                {
                    RowDefinitions = { new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }, new RowDefinition { Height = new GridLength(3) } },
                    ColumnDefinitions = { new ColumnDefinition() }
                };

                Label label = new Label { TextColor = Color.FromHex("#888888"), Text = kvp.Key, FontAttributes = FontAttributes.Bold, FontSize = 15, HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center };

                BoxView boxView = new BoxView { Color = Color.White };
                if (kvp.Value == selected_category)
                {
                    label.TextColor = Color.FromHex("#439564");
                    boxView.Color = Color.FromHex("#439564");
                }

                var label_page_switcher_tap_recognizer = new TapGestureRecognizer();
                label_page_switcher_tap_recognizer.Tapped += (sender, e) =>
                {
                    tab_switcher(sender, Menu_Grid, Oblibene_ScrollView);
                };

                label.GestureRecognizers.Add(label_page_switcher_tap_recognizer);

                var boxview_page_switcher_tap_recognizer = new TapGestureRecognizer();
                boxview_page_switcher_tap_recognizer.Tapped += (sender, e) =>
                {
                    tab_switcher(sender, Menu_Grid, Oblibene_ScrollView);
                };
                boxView.GestureRecognizers.Add(boxview_page_switcher_tap_recognizer);

                grid.Children.Add(label);

                grid.Children.Add(new NeatFrame { Content = boxView, CornerRadius = 2 }, 0, 1);

                var grid_page_switcher_tap_recognizer = new TapGestureRecognizer();
                grid_page_switcher_tap_recognizer.Tapped += (sender, e) =>
                {
                    tab_switcher(sender, Menu_Grid, Oblibene_ScrollView);
                };
                grid.GestureRecognizers.Add(grid_page_switcher_tap_recognizer);

                Menu_Grid.Children.Add(grid, j, 0);
                j++;
            }

【问题讨论】:

  • 这能回答你的问题吗? Can you attach a UIGestureRecognizer to multiple views?。在 iOS 上,您必须为每个视图创建一个新识别器。您不能将 page_switcher_tap_recognizer 附加到多个视图。
  • @ToolmakerSteve 嗨,我已经尝试过了,但是遇到了同样的问题。
  • 除非您显示您尝试过的确切代码,否则任何人都无法帮助您找出它不起作用的原因。
  • @ToolmakerSteve 抱歉,我已经更新了问题
  • 代码看起来不错。您是否从构造函数调用该代码?作为测试,将循环中的整个代码替换为 boxview (Menu_Grid.Children.Add(boxview, j, 0);) 及其点击识别器。 (循环中每个元素没有网格)查看是否在 iOS 上响应。

标签: c# xamarin.forms uitapgesturerecognizer


【解决方案1】:

正如ToolmakerSteve 提到的那样,一个手势只适用于单个视图,您不能为多个视图设置相同的手势。

因此,创建不同的手势并执行相同的操作,然后逐个添加视图。

var page_switcher_tap_recognizer = new TapGestureRecognizer();
page_switcher_tap_recognizer.Tapped += (sender, e) =>
{
    tab_switcher(sender, Menu_Grid, Oblibene_ScrollView);
};

var page_switcher_tap_recognizer2 = new TapGestureRecognizer();
page_switcher_tap_recognizer2.Tapped += (sender, e) =>
{
    tab_switcher(sender, Menu_Grid, Oblibene_ScrollView);
};


label.GestureRecognizers.Add(page_switcher_tap_recognizer);
boxView.GestureRecognizers.Add(page_switcher_tap_recognizer2);

【讨论】:

  • 嗨,我试过了,但遇到了同样的问题
  • 您是否在循环内创建点击手势?由于手势仅适用于单个视图,因此您需要在循环内创建视图和点击手势。
  • 是的,我正在创建点击手势和循环内的视图。
  • 你能给我们提供一个基本的、可重复的项目来测试吗?因为它在我这边工作得很好。
猜你喜欢
  • 2018-12-10
  • 1970-01-01
  • 2014-09-17
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多