开发者社区 问答 正文

可访问性元素在通过滑动器导航时没有聚焦,而是在触摸元素时聚焦。

我已经创建了一个自定义控件,用于在应用程序中创建导航窗格,该控件有一个内容区域和一个滑动面板,该面板可以从Xamarin.IOS中的页面边缘滑出,使用UIView,我需要为其提供可访问性支持。首先,我创建了一个视图,在其中我将添加内容区域中的元素,并将其转换为IOS呈现器中的本机视图。然后,我尝试导航添加到内容视图通过滑动器显示,但不是移动,而是在触摸元素时聚焦。...我已经准备好了isAccessibilityElement to false使内容视图具有可聚焦性...我需要在滑动的时候让这些元素可以访问。有人能帮忙吗?提前谢谢。请查找以下代码:

简单的示例代码片段:

<drawer:CustomControl  x:Name="drawer">
    <drawer:CustomControl.ContentView>
        <StackLayout Margin="0,100,0,0" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand">
            <Button Text="Button" />
            <Label Text="ContentView"/>
            <Button  Text=" Button2"/>
            <Label Text="ContentView2"/>
        </StackLayout>
    </drawer:CustomControl.ContentView>
</drawer:CustomControl>

本机代码段:

public class SimpleControl : UIView
{
    UIView contentView;
    public UIView ContentView
    {
        get
        {
            return this.contentView;
        }

        set
        {
            this.contentView = value;
            this.Add(this.contentView);
        }
    }

    public override void LayoutSubviews()
    {
        base.LayoutSubviews();

        this.IsAccessibilityElement = false;
    }
}
Xamarin.Forms

public class CustomControl: View
{
    public View ContentView
    {
        get { return (View)GetValue(ContentViewProperty); }
        set { SetValue(ContentViewProperty, value); }
    }

    public static readonly BindableProperty ContentViewProperty =  BindableProperty.Create(nameof(ContentView), typeof(View), typeof(CustomControl), null, BindingMode.Default);


    public CustomControl()
    {
    }

    protected override SizeRequest OnSizeRequest(double widthConstraint, double heightConstraint)
    {
        if (Double.IsNaN(widthConstraint) || Double.IsNaN(heightConstraint)
            || Double.IsInfinity(widthConstraint) || Double.IsInfinity(heightConstraint))
        {
            SizeRequest size = base.OnMeasure(widthConstraint, heightConstraint);
            widthConstraint = size.Request.Width;
            heightConstraint = size.Request.Height;

        }
        return new SizeRequest(new Size(widthConstraint, heightConstraint));
    }
}

IOS渲染器:

public class CustomControlRenderer : ViewRenderer<CustomControl, Native>
{
    public CustomControlRenderer()
    {
    }

     Native nativeDrawer;
     CustomControl drawer;
     protected override void OnElementChanged(ElementChangedEventArgs<CustomControl> e)
     {
        base.OnElementChanged (e);
        if (e.NewElement != null) {
            drawer = e.NewElement;

            if (nativeDrawer == null)
            {
                nativeDrawer = new Native ();
                UIView v = new UIView();
                v.Frame = new CGRect(0, 0, 600, 1500);
                nativeDrawer.ContentView = CustomControlRenderer.ConvertFormsToNativeView(drawer.ContentView, v.Frame, drawer, drawer.BindingContext);
            }

            SetNativeControl(nativeDrawer);
        }
     }


    internal static UIView ConvertFormsToNativeView(Xamarin.Forms.View view, CGRect size, CustomControl drawer, object bindingContext)
    {
        if (view == null)
            return null;
        if (view.BindingContext == null)
        {
            if (bindingContext != null)
            {
                view.BindingContext = bindingContext;
            }
            else
            {
                view.BindingContext = drawer.BindingContext;
            }
        }

        return GetNativeView(view, drawer, view.BindingContext, 0, 0, size.Width, size.Height);
    }
}

展开
收起
游客5akardh5cojhg 2019-12-16 22:23:51 456 分享 版权
阿里云 AI 助理回答

为了确保你的自定义控件在滑动时能够正确地提供可访问性支持,你需要确保几个关键点得到妥善处理:

  1. 确保子视图的可访问性:你已经为内容视图设置了 IsAccessibilityElement = false,这是正确的做法,因为你想让内容区域内的元素成为可访问焦点。接下来,确保内容视图中的所有交互元素(如按钮、标签等)都设置为 IsAccessibilityElement = true,并提供适当的 AccessibilityLabelAccessibilityHint

  2. 处理触摸事件以辅助移动和聚焦:当用户尝试通过触摸来与滑动面板互动时,需要确保这些触摸事件不仅用于显示或隐藏面板,还要能帮助辅助技术(如VoiceOver)理解并聚焦到正确的元素上。你可以重写或监听相关触摸事件,并在适当的时候调用 UIAccessibility.PostNotification(UIAccessibilityPostNotification.ScreenChanged, yourFocusedElement) 来通知系统当前应该聚焦的元素已改变。

  3. 更新布局以响应可访问性焦点变化:如果滑动面板的显示或隐藏应当与可访问性焦点的变化同步,那么在调整视图布局时也要考虑这一点,确保当一个元素获得焦点时,它在屏幕上的位置对于辅助技术用户是合理的。

  4. 测试可访问性功能:使用Xcode的模拟器内置的VoiceOver或其他辅助技术工具来彻底测试你的控件,确保所有预期的行为都能正常工作。

针对你的代码,以下是一些可能需要添加或修改的部分示例:

// 在NativeControl内部或相关方法中处理触摸事件,以便于辅助功能聚焦
public override void TouchesBegan(NSSet touches, UIEvent evt)
{
    base.TouchesBegan(touches, evt);
    // 假设你有一个逻辑来决定哪个元素应当被聚焦
    var focusedElement = DetermineFocusedElementBasedOnTouches(touches);
    if (focusedElement != null)
    {
        UIAccessibility.PostNotification(UIAccessibilityPostNotification.ScreenChanged, focusedElement);
    }
}

// 确保内容视图内的每个子视图都有正确的可访问性属性
foreach (var subview in ContentView.Subviews)
{
    subview.IsAccessibilityElement = true;
    // 设置其他必要的可访问性属性,如Label和Hint
}

// 你可能还需要根据滑动面板的状态来调整子视图的可访问性,确保只有当前可见且应交互的元素才可访问。

请记住,具体实现细节会根据你的应用逻辑和需求有所不同,但上述指导原则应该能帮助你朝着正确的方向前进。务必进行详尽的可访问性测试,确保所有用户都能顺畅地使用你的应用程序。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: