问题标签 [mongolian-vertical-script]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - UITextView 的内容在调整大小后因额外空间而错位
问题的背景和描述
我制作了一个垂直文本视图以用于蒙古语。它是一个自定义文本视图,由三层视图组成:子UITextView
视图、用于容纳 的容器视图(旋转 90 度并翻转)UITextView
和父视图。(有关更多背景信息,请参见此处和此处。)
视图根据底层文本视图的内容大小增加其大小,只要它在最小和最大大小之间。然而,在过去的几天里,我一直在努力修复一个错误,即添加了额外的空间并且内容向左移动(这将在底层文本视图的坐标上)。这可以在下图中观察到。黄色视图是自定义文本视图(inputWindow
在下面的视图控制器代码中调用。)
在我点击 enter 几次以增加内容视图的大小后,添加了一个额外的空间。试图滚动视图什么也没做。(在宽度达到最大值并且内容大小大于框架大小后,滚动确实有效。)就好像内容处于滚动中间时它被冻结在适当的位置之前它可以放置在正确的位置。如果我插入另一个字符(如空格),则内容视图会自行更新到正确的位置。
问题
我需要改变什么?或者我如何手动强制底层证券UITextView
在正确的位置显示其内容视图?
代码
我试图删除所有无关的代码,只保留视图控制器和自定义垂直 TextView 的相关部分。如果还有什么我应该包括的,请告诉我。
视图控制器
当内容视图大小发生变化时,视图控制器会更新自定义文本视图的大小约束。
自定义垂直文本视图
这个自定义视图基本上是一个围绕 a 的外壳UITextView
,允许旋转和翻转以正确查看传统的蒙古语。
我试过的
我尝试过的许多想法都来自How do I size a UITextView to its content? 具体来说,我尝试过:
设置框架而不是自动布局
在layoutSubviews()
我做的自定义视图方法中
而且我没有在setup()
. 没有明显的效果。
允许非连续布局
这也没有效果。(建议在这里。)
设置需求布局
setNeedsLayout
我已经尝试了 inputWindow和setNeedsDisplay
底层文本视图的各种组合。
甚至在 a 内部,dispatch_async
以便它在下一个运行循环中运行。
尺寸适合
在更新宽度约束后执行sizeToFit
下一个运行循环起初看起来很有希望,但它仍然没有解决问题。有时内容会冻结,有时会滚动。它并不总是每次都冻结在同一个地方。
延迟
我一直在考虑安排一个延迟的事件,但这感觉就像一个黑客。
重复?
一个类似的问题是UITextview 在不应该的时候获得了额外的一行。但是,它在 Objective-C 中,所以我不能说得很好。它也是6岁没有答案。
这个答案还提到了 iPhone 6+ 上的额外空间(我上面的测试图像是 iPhone 6,而不是 6+)。但是,我想我尝试了该答案中的建议。也就是说,我做到了
没有明显的效果。
更新:一个基本的可重现项目
为了使这个问题尽可能重现,我做了一个独立的项目。它可以在 Github 上找到。故事板布局如下所示:
黄色UIView
类是inputWindow
并且应该设置为UIVerticalTextView
。浅蓝色视图是topContainerView
. 下面的按钮取代了键盘。
添加显示的自动布局约束。输入窗口的宽度约束为 80,高度约束为 150。
将出口和操作连接到下面的视图控制器代码。此视图控制器代码完全替换了我在上面的原始示例中使用的视图控制器代码。
视图控制器
UIVerticalTextView
使用与原始示例中相同的代码,UIVerticalTextView
但添加了以下两种方法。
测试
- 点击“插入文本”几次。(请注意,文本是向后的,因为实际的应用程序使用镜像字体来补偿翻转的文本视图。)
- 点击“新行”五次。
- 尝试滚动视图。
观察内容放错位置并且视图不会滚动。
我需要做什么来解决这个问题?
android - 在自定义 ViewGroup 子类中调整旋转子视图的大小
背景
我有一个自定义ViewGroup
子类,可以旋转并镜像其子视图。这样做的目的是正确显示传统的蒙古文文本。
我可以放任何东西ViewGroup
,但是对于我当前的项目,我放了一个EditText
。(我从来没有成功地直接旋转和镜像EditText
。但是,将它包装在这个自定义视图组中确实有效。)
问题
我的问题是,当我尝试以ViewGroup
编程方式调整大小时,它的子视图没有随着它正确调整大小。我希望EditText
匹配父级的大小ViewGroup
,使其看起来像一个视图。
我做了一个新项目来展示这个问题。该按钮增加了 ViewGroup 的宽度(以红色显示)。图像显示项目开始(一切正常)和两个宽度增量。它EditText
是白色的,即使宽度和高度设置为也不会调整大小match_parent
完整的项目代码如下。
MongolViewGroup.java(旋转和镜像其内容的自定义 ViewGroup)
MainActivity.java
activity_main.xml
android - 禁用 EditText 上下文菜单
我正在EditText
为传统的蒙古语制作垂直。我已经通过EditText
在一个旋转的ViewGroup
. 我需要创建一个完全自定义的上下文菜单,因为系统不支持垂直文本,并且在旋转时也不ViewGroup
旋转。所以我想完全禁用系统上下文菜单。
请注意,这与这些只是试图禁用复制/粘贴/等的问题不同:
- 如何禁用从/到 EditText 的复制/粘贴
- EditText:禁用文本选择处理程序单击事件上的粘贴/替换菜单弹出
- 如何在android EditText中禁用粘贴选项
- Android:如何在 Edittext 中完全禁用复制和粘贴功能
虽然我没有在模拟器中看到上下文菜单,但我在我的 Android 5.0.2 小米手机中看到了它。
我努力了:
我对黑客持开放态度,但我需要它能够跨设备始终如一地工作。Mark Murphy(一个 Commons Guy)回复了另一个试图做类似事情的用户:
我怀疑即使你想出了一个答案,它也不会跨设备工作。设备制造商倾向于为 EditText 推出他们自己的“上下文菜单”,从而挫败了开发人员将项目添加到该上下文菜单中的尝试。我的猜测是,试图阻止该上下文菜单会产生类似的结果。
我运气不好?
我现在唯一能想到的就是完全重写TextView
并EditText
从头开始(嗯,通过修改Android源代码)。我认识其他人做过类似的事情,但他的代码不是开源的。在迈出这一重要步骤之前,我想尝试在 Stack Overflow 上寻求更简单的解决方案。
更新:TextView
过去两天我一直在尝试修改源代码,它看起来像是一个 6 个月的项目。它是一堆相互关联的类。我需要另一种解决方案,但我没有想法。
MVCE
这是我能想到的重现问题的最简单方法。我的习惯没有什么必要的EditText
。布局有一个EditText
通过替换默认项目 Hello World's 制作的TextView
。我将 min API 更改为 11 以避免处理已弃用的方法。
当我单击光标句柄(但不是长按或双击)时,模拟器中的上下文菜单(运行 API 24)仍然显示。这是一张图片:
在我运行 Android 5.0 的小米 MIUI 手机上,我在所有情况下(光标句柄单击、长按、双击)都能获得上下文菜单。
更新
Aritra Roy 的解决方案在模拟器、他测试过的其他一些设备以及我的设备上运行。我接受了他的回答,因为它解决了我原来的问题。唯一的负面影响是文本选择也被禁用。
android - 从 Android 中的自定义键盘在 EditText 上设置撰写文本
解释我想要做什么
我正在制作一个自定义应用内键盘,其工作原理与此示例相同。但是,在我的键盘中,我使用弹出窗口来显示额外的字母形式。在传统的蒙古文中,字母有不同的形式,具体取决于它们是位于单词的开头、中间还是结尾。通常这些可以从上下文中确定,但有时用户需要从弹出键候选中明确选择替代形式。
假设用户开始输入一个单词(其中-
代表字母):
然后他们a
从弹出窗口中选择(我只是a
用来表示选择一种特殊的蒙古字形形式的概念)。如果他们继续输入,这封信的 Unicode 将呈现如下:
但是,Unicode 呈现为
在词尾。(a
并且A
在 Unicode 中有相同的代码。)所以用户很困惑为什么他们a
从弹出键中选择,但它会像A
在编辑器中一样呈现。但是,如果他们只是继续打字,那会很好,因为它会呈现a
在单词的中间。
我想要做的是在 of 上设置某种临时跨度a
,---a
这样它就不会像---A
在他们键入下一个字母之前那样被渲染。但是如果他们添加一个空格或将光标移动到不同的位置,那么它将恢复---A
为最终字母的默认形式。(即临时跨度将被取消。)
真实例子
如果抽象a
而A
过于混乱,这里有一个真实的例子。用户想在这个词中输入一个蒙古语UE
形式(Unicode )\u1826\u180c
但是因为\u1826\u180c
在词尾呈现这样
用户在继续输入之前会感到困惑。我希望跨度使它看起来像这样
可以用 . 临时渲染\u1826\u180c\u200d
。
文档
文件说_
如果您的 IME 进行文本预测或需要多个步骤来编写字形或单词,您可以在文本字段中显示进度,直到用户提交单词,然后您可以将部分合成替换为完整的文本。
它给出了这个例子和图像:
问题
我打算在本节中描述它为什么不起作用,但在此处设置我的问题的过程中,我发现它确实有效。因此,我将在下面添加我的答案作为其他人做类似事情的示例。
flutter - Flutter 的垂直文本小部件
TextDirection文档说:
Flutter 旨在满足使用世界上任何一种当前使用的语言编写的应用程序的需求,无论它们使用从右到左还是从左到右的书写方向。Flutter 不支持其他书写模式,例如竖排文本或 boustrophedon 文本,因为这些在计算机程序中很少使用。(重点补充)
Flutter 不仅不支持竖排文本,未来也不会正式支持。这是一个早期的设计决定(参见此处和此处)。
即便如此,如今垂直脚本支持仍有实际用途。除了某些中文和日文用途外,传统的蒙古文字也需要它。该脚本在内蒙古的计算机程序中非常常用(示例,示例,示例,示例,示例,示例)。
它是从上到下写的,从左到右换行:
此外,表情符号和 CJK 字符在垂直显示时保持其方向(不是绝对必要,但首选)。在下图中,顶部段落显示了当前的实现,底部段落显示了正确的垂直渲染:
由于 Flutter 不支持垂直脚本,所以必须从头开始实现。所有实际的文本布局和绘画都是在 Flutter 引擎中使用LibTxt完成的,所以我无法更改。
创建一个从上到下的垂直文本小部件会涉及什么?
更新
我还在寻找答案。Rémi 的答案适用于单行文本,但不适用于多行文本。
我目前正在研究三种不同的可能解决方案:
- 创建一个支持类似于 RichText 小部件的自定义 StatelessWidget的 RenderObject 子类(或者可能是RenderParagraph子类)。
- 使用 CustomPaint 小部件
- 制作 ListView(每行一行)、Text 小部件和 WidgetSpan 的复合小部件。
所有这些都涉及测量文本、布置文本并获取行列表。
另一个更新
我目前倾向于制作一个自定义小部件和渲染对象,以模仿 RichText 和 RenderParagraph。在底层 RenderParagraph 使用 TextPainter 来布局和绘制文本。我现在的问题是 TextPainter 与底层的 Skia LibTxt 库紧密耦合。那是所有实际布局和绘画发生的地方。在默认的 ltr 和 rtl 之外的任何地方布置文本被证明是一个大问题。
又一次更新
接受的答案符合我在这个问题中提出的标准。我认为这将满足短期需求。我对应用文本样式之类的事情有一些保留,但我需要做更多的测试。从长远来看,我可能仍会尝试自定义文本布局和绘画。