繁体   English   中英

Xamarin.IOS防止在选择时滚动到底部

[英]Xamarin.IOS Prevent scrolling to bottom on select

(渲染逻辑来自此SO帖子中的以下答案: 选择文本并从标签xamarin形式复制

我遇到一个问题,即我拥有的只读编辑器在iOS中表现出奇怪的行为。 当我突出显示一个项目时,它会先滚动到底部,然后在我选择要突出显示的文本时又滚动回到中间。 但是,第一次执行此操作后,它将不再再次执行此操作(这很好)。 但是,当您进入局部视图时,它总是第一次这样做一次。 这一切都始于我们遇到了一个错误,即用户无法选择要复制和粘贴的文本,该错误已修复,但现在iOS正在显示此问题。

这是自定义Editor类:

public partial class BorderlessReadOnlyEditor : Editor {

    }

这是渲染器:

public class BorderlessReadOnlyEditorRenderer : EditorRenderer {

        protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
        {
            base.OnElementChanged(e);

            if (Control == null) return;

            Control.Selectable = true;
            Control.Editable = false;
            Control.ScrollEnabled = false;
            Control.TextContainerInset = UIEdgeInsets.Zero;
            Control.TextContainer.LineFragmentPadding = 0;
        }
    }

XAML如下,我将视图(DetailComponent)渲染为DetailPage的一部分,如下所示:

<StackLayout 
                Margin="20, 0, 20, 0"
                VerticalOptions="FillAndExpand"
                HorizontalOptions="FillAndExpand">
                <views:DetailComponent />
                <views:DetailComponent x:Name="Details"/>
            </StackLayout>

然后在DetailView本身内部,我要显示用户之前保存的文本的区域如下:

<ScrollView 
        x:Name="BodyScroller" 
        x:FieldModifier="Public"
        Margin="0, 0, 0, 30" 
        VerticalOptions="FillAndExpand"  
        HorizontalOptions="FillAndExpand" >
        <Label 
        <customcontrols:BorderlessReadOnlyEditor 
            x:Name="BodyLabel"
            x:FieldModifier="Public"
            Text="{Binding SelectedNote.Body}"
            TextColor="Black"
            FontSize="16"
            VerticalOptions="StartAndExpand"
            HorizontalOptions="StartAndExpand"/>
    </ScrollView>

如果我还需要显示背后的代码,请告诉我。 我真的很希望能够尽可能地防止任何自动滚动行为。 最初它是一个标签,但是据我所知,在Xamarin中,如果它是标签,则很难让UI文本突出显示和复制

因此,解决方案是双重的

  1. 首先,我必须删除自定义编辑器周围的
  2. 然后,在代码中,我必须在DetailComponent.xaml.cs中手动设置BodyLabel(自定义编辑器)的高度,该高度包含编辑器,如下所示:

    公共局部类DetailComponent:StackLayout {public DetailComponent(){InitializeComponent();

      if (Device.Idiom == TargetIdiom.Phone) { this.BodyLabel.HeightRequest = DeviceDisplay.MainDisplayInfo.Height * 0.25; } else { this.BodyLabel.HeightRequest = DeviceDisplay.MainDisplayInfo.Height * 0.33; } } } 

这些百分比旨在确保滚动,因为我们在顶部具有标准标头大小(因此,对于此特定用例,如果此答案对您有帮助,则可能需要对其进行修改)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM