标签: mongolian-vertical-script

在Swift中使用Unicode代码点

如果您对Mongolian的细节不感兴趣,但只想快速回答有关在Swift中使用和转换Unicode值的问题,请跳到接受答案的第一部分.


背景

我想渲染传统蒙古语的 Unicode文本,以便在iOS应用程序中使用.更好和长期的解决方案是使用AAT智能字体来渲染这个复杂的脚本.(这些字体确实存在,但它们的许可证不允许修改和非个人使用.)但是,由于我从未制作过字体,更不用说AAT字体的所有渲染逻辑了,我只是打算自己进行渲染.斯威夫特现在.也许在以后我可以学习制作智能字体.

在外部我将使用Unicode文本,但在内部(在a中显示UITextView)我将Unicode转换为以哑字体存储的单个字形(用Unicode PUA值编码).所以我的渲染引擎需要将蒙古语Unicode值(范围:U + 1820到U + 1842)转换为存储在PUA中的字形值(范围:U + E360到U + E5CF).无论如何,这是我的计划,因为它是我过去在Java中所做的,但也许我需要改变我的整个思维方式.

下图显示su在蒙古语中使用两种不同形式的字母u(红色)两次写入.(蒙古文是垂直书写的,字母连接像英文草书一样.)

在此输入图像描述

在Unicode中,这两个字符串将表示为

var suForm1: String = "\u{1830}\u{1826}"
var suForm2: String = "\u{1830}\u{1826}\u{180B}"
Run Code Online (Sandbox Code Playgroud)

自由变量选择器(U + 180B)in suForm2被Swift识别(正确)String为与其前面的u(U + 1826)的单位.Swift认为它是一个单一的字符,一个扩展的字形集群.但是,为了自己进行渲染,我需要将u(U + 1826)和FVS1(U + 180B)区分为两个不同的UTF-16代码点.

出于内部显示的目的,我将上述Unicode字符串转换为以下呈现的字形字符串:

suForm1 = "\u{E46F}\u{E3BA}" 
suForm2 = "\u{E46F}\u{E3BB}"
Run Code Online (Sandbox Code Playgroud)

我一直在玩Swift StringCharacter.关于它们有很多方便的东西,但是因为在我的特殊情况下我只使用UTF-16代码单元,我想知道我是否应该使用旧的NSString而不是Swift的String.我意识到我可以String.utf16 …

string unicode ios swift mongolian-vertical-script

51
推荐指数
1
解决办法
4万
查看次数

如何在Swift中为iOS创建垂直文本UILabel和UITextView?

如果你根据标题来讨论这个问题,但对蒙古语不感兴趣,你可能会寻找这个问答:


我一直在学习Swift,以便为传统的蒙古语开发iOS应用程序.问题是传统的蒙古语是从上到下,从左到右垂直书写的.我的问题是如何垂直显示文本并仍然有换行功能?

如果你和我待在一起,我会试着更清楚地解释这个问题.下面是我想要实现的文本视图的图像.如果外国脚本将你抛弃,我已经包含了遵循相同模式的英文文本.事实上,如果应用程序有任何英文文本要显示,这应该是它的外观.

在此输入图像描述

对于简单的单线UILabel,顺时针旋转90度就可以了.但是,对于多行UITextView,我需要处理换行.如果我只做一个普通的90度旋转,写的第一件事最终会在最后一行.

到目前为止,我已经制定了一个我认为可以解决这个问题的计划:

  1. 制作一个自定义字体,其中所有字母都垂直镜像.
  2. 顺时针旋转文本视图90度.
  3. 水平镜像文本视图.

在此输入图像描述

这应该照顾文本包装.

我可以做镜像字体.但是,我不知道如何为UITextView的旋转和镜像执行Swift编码.我发现以下链接似乎给解决方案的部分提示,但它们都在Objective C中,而不是在Swift中.

应用程序商店中有传统的蒙古应用程序(像这样这个),但我还没有找到任何人共享他们的源代码,所以我不知道他们在幕后做什么来显示文本.我打算让我的代码开源,以便将来的其他人不会为数百万阅读传统蒙古语的人开发应用程序.你可以给予这项努力的任何帮助,不仅是我,也是蒙古人民.即使你不了解自己,提出这个问题以使其更加明显也会有所帮助.

更新

@ sangonz的答案仍然是一个很好的答案,但我暂时将其标记为已接受的答案,因为我无法让一切顺利.特别:

  • 启用滚动(通过在滚动视图中嵌入自定义视图或通过子类化UIScrollView).在github项目中,@ sangonz说这应该很容易,但它不适合我.
  • 在方向改变时获得字线的重新布局(而不是拉伸).我认为通过更多的研究来解决这个问题应该不会太难.
  • 为什么文本行不会一直到视图的边缘?底部存在很大差距.
  • 如何取消链接自定义垂直视图的NSTextStorage与其他UITextView.(见这个问题)

到目前为止,我一直在使用上面提到的原始方法,但我真正想要的是获得类似@sangonz提议的工作方式.

我现在也在考虑其他方法

uitextview uilabel ios swift mongolian-vertical-script

46
推荐指数
1
解决办法
6142
查看次数

禁用EditText上下文菜单

我正在EditText为传统的蒙古人做垂直.我通过EditText在旋转的内部嵌入一​​个略微修改的内容来成功实现它ViewGroup.我需要创建一个完全自定义的上下文菜单,因为系统不支持垂直文本,并且在旋转时也不会ViewGroup旋转.所以我想完全禁用系统上下文菜单.

请注意,这与仅仅尝试禁用复制/粘贴/等的这些问题不同:

虽然我没有在模拟器中出现上下文菜单,但我将它出现在我的Android 5.0.2小米手机中.

我试过了:

我对hacks持开放态度,但我需要它能够在各种设备上持续工作.马克·墨菲(下议院人)写了一段时间,早在回答其他用户试图做同样的事情:

我怀疑,即使你拿出一个答案,它也无法在各种设备上运行.设备制造商倾向于为EditText推出自己的"上下文菜单",从而使开发人员尝试将项目添加到该上下文菜单中.我的猜测是,试图阻止该上下文菜单会产生类似的结果.

我运气不好吗?

我现在唯一能想到的就是完全重写TextViewEditText从头开始(好吧,通过修改Android源代码).我知道其他人做了类似的事,但他的代码不是开源的.在我采取这一重大步骤之前,我想尝试在Stack Overflow上寻求更简单的解决方案.

更新:我一直在尝试修改TextView过去两天的源代码,看起来像是一个6个月的项目.这是一大堆相互关联的课程.我需要另一种解决方案,但我没有想法.

MVCE

这是我能想到的最简单的方法来重现问题.我的习惯没有必要EditText.布局有一个EditText替换默认项目Hello World的TextView.我将min API更改为11以避免处理已弃用的方法.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = (EditText) findViewById(R.id.edit_text);
        editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
            @Override
            public boolean onCreateActionMode(ActionMode actionMode, Menu …
Run Code Online (Sandbox Code Playgroud)

android contextmenu android-edittext mongolian-vertical-script

31
推荐指数
4
解决办法
6178
查看次数

具有可变单元格高度的UITableView:在IB中工作但不是以编程方式工作

TL; DR

我以编程方式创建的表格视图单元格未根据其自定义视图的内在内容高度进行大小调整,即使我正在使用UITableViewAutomaticDimension并设置顶部和底部约束.

问题可能在于我的UITableViewCell子类实现.请参阅下面的代码"无法以编程方式工作">"代码">"MyCustomCell.swift".

目标

我正在尝试为自定义蒙古语键盘制作一个建议栏.蒙古文是垂直写的.在Android中它看起来像这样:

在此输入图像描述

进展

我已经知道我应该使用一个UITableView可变单元格高度,从iOS 8开始可以使用.这需要使用自动布局并告诉表格视图使用单元格高度的自动尺寸.

我一直在学习的一些事情在我最近的SO问题和答案中有所体现:

所以我已经达到了支持内在内容大小的垂直标签.这些标签放在我的自定义表格视图单元格中.并且如下一节所述,它们在我在故事板中执行时起作用,但在我以编程方式创建所有内容时则不起作用.

在IB工作

为了隔离问题,我创建了两个基本项目:一个用于我使用故事板的地方,另一个用于以编程方式执行所有操作.故事板项目有效.从下图中可以看出,每个表格视图单元格都会调整大小以匹配自定义垂直标签的高度.

在此输入图像描述

在IB

我设置约束来固定顶部和底部以及使标签居中.

在此输入图像描述

ViewController.swift

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    let myStrings: [String] = ["a", "bbbbbbb", "cccc", "dddddddddd", "ee"]
    let cellReuseIdentifier = "cell"

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self

        tableView.estimatedRowHeight = 44.0
        tableView.rowHeight = UITableViewAutomaticDimension
    }

    // number of rows in …
Run Code Online (Sandbox Code Playgroud)

uitableview ios swift mongolian-vertical-script

25
推荐指数
2
解决办法
1311
查看次数

自定义旋转的EditText视图,包含工作选择,光标位置等

我想做的事

我想创建一个旋转和翻转的EditText视图,该视图具有普通EditText视图的所有属性.

我的问题

我已经成功地(在SO用户的帮助下)创建了一个自定义的EditText视图,该视图既可以旋转也可以翻转.这是通过重写onDraw方法完成的.但是,光标和突出显示消失,longtouch事件仍指示原始文本位置.基本上,视图被重绘,但触摸事件不是.

如何旋转和翻转触摸事件,突出显示和光标?

我读过的

带选择的EditText比例(类似的问题,但不完全相同.)

如何制作一个自定义的Edittext,以便它看起来像在Android中旋转45度(@CommonsWare注意到一个解决方案,需要通过触摸事件完成添加工作.那是什么工作?)

http://developer.android.com/training/graphics/opengl/touch.html(有帮助,但我不明白如何在这种情况下应用它.)

我试过了什么

我创建了一个扩展EditText的自定义视图.在其中覆盖onDraw方法以旋转和翻转画布.我重写onMeasure以使视图具有适合布局的尺寸.

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.widget.EditText;

public class MongolEditText extends EditText {

// Constructors
public MongolEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}
public MongolEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}
public MongolEditText(Context context) {
    super(context);
    init();
}

// This class requires the mirrored Mongolian font to be in the assets/fonts folder
private void …
Run Code Online (Sandbox Code Playgroud)

android rotation android-edittext mongolian-vertical-script

18
推荐指数
1
解决办法
2439
查看次数

如何通过从Swift中的UIScrollView继承它来创建一个垂直的UITextView?

背景

我是iOS开发的新手,但为了开始使用垂直蒙古语脚本制作最基本的应用程序,我需要有一个垂直UITextView.我没有找到任何其他蒙古应用程序开发人员共享他们的代码所以我试图自己做.蒙古语从上到下书写,线条从左到右换行,如下图所示:

在此输入图像描述

滚动应该是水平的(从左到右).

之前的一个问题中,我提出了镜像字体和旋转和镜像的组合UITextView(因为这是我在Android中所做的).然而,在阅读了这个答案并进一步研究iOS的做事方式(比如使用TextKit)之后,我认为UIVerticalTextView从头开始创建类似的东西可能会更好,而不是搞乱正常情况UITextView.因为我看到UITextView来自UIScrollView的inheirits,我认为我应该继承UIScrollView来制作UIVerticalTextView.

我现在在哪里

我上面提到答案UIView是子类,但我在滚动工作时遇到了很多麻烦.这是我想要子类化的另一个原因UIScrollView.当方向改变时,该解决方案也没有重新布置每行中的单词.

我收集了以下部分,但我不确定如何将它们组合在一起:

  • NSTextStorage - 这应该没有什么不同.它只存储蒙古语Unicode文本和任何样式信息.
  • NSTextContainer - 需要切换高度和宽度以提供垂直文本容器大小.(我想是的,无论如何.除非这可以在其他地方完成.)
  • NSLayoutManager - 有什么特别需要在这里完成或是由UIVerticalTextView?照顾?
  • UIVerticalTextView - 这将是一个子类,UIScrollView但需要添加和/或覆盖的方法是什么?

    class UIVerticalTextView: UIScrollView {
    
        // Which properties to include?
        //     - TextStorage
        //     - TextContainer
        //     - LayoutManager
    
        // which methods to override?
    
        // which methods to add to …
    Run Code Online (Sandbox Code Playgroud)

uiscrollview uitextview ios swift mongolian-vertical-script

17
推荐指数
1
解决办法
988
查看次数

Flutter的垂直文本小部件

TextDirection文档说:

Flutter旨在满足使用世界上当前使用的任何语言编写的应用程序的需求,无论它们使用从右到左还是从左到右的书写方向。Flutter不支持其他书写模式,例如竖排文本或Boustrophedon文本,因为这些模式很少在计算机程序中使用。(添加了重点)

Flutter不仅不支持垂直文本,而且将来也不会正式支持它。这是一个早期的设计决定(请参阅此处此处)。

即使这样,今天对垂直脚本的支持还是有实际用途的。除了某些中文和日文用法外,传统的蒙古文字还需要它。该脚本在内蒙古的计算机程序中非常常用(例如exampleexampleexampleexampleexampleexample)。

它是从上到下写的,行从左到右环绕:

在此处输入图片说明

此外,表情符号和CJK字符在垂直显示时仍保持其方向(并非绝对必要,而是首选)。在下图中,顶部显示了当前的实现,底部显示了正确的垂直渲染:

在此处输入图片说明

// sample text
???? ????? ????? ????? ???? ???????? ??????? ?????? ???? ???? one two three four five six seven eight nine ten ?? ??? ????? English? ???????
Run Code Online (Sandbox Code Playgroud)

由于Flutter不支持垂直脚本,因此必须从头开始实施。所有实际的文本布局和绘画都是使用LibTxt在Flutter引擎中完成的,所以我无法更改它。

创建从上到下的垂直文本小部件会涉及什么?

更新资料

我还在寻找答案。Rémi的答案适用于单行文本,但不适用于多行文本。

我目前正在研究三种不同的可能解决方案:

  • 创建一个RenderObject子类(或者可能是RenderParagraph子类)来支持类似于RichText小部件的自定义StatelessWidget。
  • 使用CustomPaint小部件
  • 制作一个ListView(每行文本一行),Text小部件和WidgetSpans的复合小部件。

所有这些将涉及测量文本,对其进行布局并获得行列表。

另一个更新

我目前倾向于制作自定义的小部件和渲染对象,以模仿RichText和RenderParagraph。在后台,RenderParagraph使用TextPainter来布局和绘制文本。我现在的问题是TextPainter与底层的Skia LibTxt库紧密耦合。这就是所有实际布局和绘画的地方。除了默认的ltr和rtl外,将文本放置在其他任何地方都被证明是一个大问题。

另一个更新

接受的答案符合我在这个问题中提出的标准。我认为它将满足短期需求。对于应用文字样式,我有些保留,但我需要做更多测试。从长远来看,我仍然可以尝试自定义文本布局和绘画。

custom-widgets dart flutter mongolian-vertical-script

14
推荐指数
3
解决办法
1214
查看次数

调整大小后,UITextView的内容会被多余的空间放错位置

背景和问题的描述

我制作了一个垂直文本视图,用于蒙古语.它是一个自定义文本视图,由三层视图组成:子UITextView视图,容器视图(旋转90度并翻转)以保存UITextView和父视图.(有关更多背景信息,请参阅此处此处.)

只要介于最小和最大大小之间,视图就会根据基础文本视图的内容大小增加其大小.但是,在过去的几天里,我一直在努力修复一个错误,即添加了一个额外的空间并且内容向左移动(这将在底层文本视图的坐标上).这可以在下图中观察到.黄色视图是自定义文本视图(inputWindow在下面的视图控制器代码中调用.)

在此输入图像描述

点击输入几次以增加内容视图的大小后,会添加一个额外的空格.试图滚动视图什么也没做.(在宽度达到最大值并且内容大小大于帧大小之后滚动会起作用.)就好像内容在它被放置到正确位置之前被冻结到位时处于滚动的中间位置.如果我插入另一个字符(如空格),则内容视图会将其自身更新到正确的位置.

我需要改变什么?或者,如何手动强制底层UITextView显示其内容视图在正确的位置?

我试图删除所有无关的代码,只留下View Controller和Custom Vertical TextView的相关部分.如果还有其他我应该包括的内容,请告诉我.

查看控制器

视图控制器在内容视图大小更改时更新自定义文本视图的大小约束.

import UIKit
class TempViewController: UIViewController, KeyboardDelegate {

    let minimumInputWindowSize = CGSize(width: 80, height: 150)
    let inputWindowSizeIncrement: CGFloat = 50

    // MARK:- Outlets
    @IBOutlet weak var inputWindow: UIVerticalTextView!
    @IBOutlet weak var topContainerView: UIView!
    @IBOutlet weak var keyboardContainer: KeyboardController!
    @IBOutlet weak var inputWindowHeightConstraint: NSLayoutConstraint!
    @IBOutlet weak var inputWindowWidthConstraint: NSLayoutConstraint!


    override func viewDidLoad() {
        super.viewDidLoad()

        // get rid …
Run Code Online (Sandbox Code Playgroud)

uitextview ios swift mongolian-vertical-script

11
推荐指数
1
解决办法
688
查看次数

自定义字体显示在IB中,但不在模拟器中显示

我已经设置了a UITextView和a UILabel来使用自定义字体.(它是一个垂直镜像的蒙古语字体,但我还包括英文文本,以便您可以看到效果.)单词显示在Interface Builder中,但在模拟器中,大多数字符UITextView只是空框.奇怪的是,在UILabel模拟器中正确显示的字符中.

如何将它们显示在UITextView同样的位置?

在此输入图像描述

笔记:

  • 我使用的是Xcode版本6.3.2.从这个SO Q&A我知道自定义字体应该与IB中的Xcode 6一起使用.
  • 我已将我的字体文件添加到项目中,并从自定义字体列表中为其选择UITextViewUILabel.
  • 我在我的项目中添加了"应用程序提供的字体"键Info.plist,并将自定义字体添加到其中. 在此输入图像描述
  • 这个问题非常相似(但不同,因为它没有提及UITextViewUILabel问题).在撰写本文时,该问题的OP并未表明最高投票答案是否有帮助.我在那个答案中运行了代码,以确认我的字体是否真的在捆绑中.我得到了以下结果,它确认它在捆绑中,因此仍然无法解决我的问题.

    Family : ChimeeWhiteMirrored
        Font : ChimeeWhiteMirrored
    
    Run Code Online (Sandbox Code Playgroud)

有没有人看到我的错误或有任何其他想法?

更新

收到@ darkheartfelt的downvote并评论下面的答案后,我重新创建了我原来的问题,想想也许我错过了什么.虽然在iOS 9中字体在模拟器中的显示方式有所不同,但基本问题仍然存在:它在IB中看起来不错但在模拟器中看起来不行.

在此输入图像描述

问题可以重现如下(使用Xcode 7.1.1):

  1. 启动一个新的单一视图项目.
  2. 该字体添加到项目中(可下载这里从相关github上的项目)
  3. 在Info.plist文件中添加"由应用程序提供的字体",字体名称为"ChimeeWhiteMirrored.ttf".
  4. 确认目标的"复制包资源"包含ChimeeWhiteMirrored.ttf.
  5. 添加UITextView到故事板.
  6. 在IB属性检查器中粘贴以下文本: 1-10: ??? ????? ???? ???? ??? ??????? ?????? ????? ???? ??? one two three four five six seven …

xcode fonts interface-builder ios mongolian-vertical-script

10
推荐指数
1
解决办法
4539
查看次数

如何在Android中制作传统的蒙古文字TextView

你如何使用Android应用程序进行垂直(从左到右的换行)Mongolian脚本TextViews?

背景

Android对世界上许多语言都有相当好的支持,甚至包括阿拉伯语和希伯来语等RTL语言.然而,对于像传统蒙古语这样的自上而下的语言没有内置的支持(在内蒙古仍然非常活跃,不能与西里尔语蒙古语混淆).下图显示了为清晰起见添加了英语的文本方向.

在此输入图像描述

由于此功能未内置于Android中,因此几乎使应用程序开发的每个方面都非常困难.在线提供的信息非常非常少.(少数几个相关的SO问题之一甚至没有一个好的答案.)有许多应用程序开发人员为传统的蒙古语,但无论是出于商业原因还是其他原因,他们似乎并没有使他们的代码开源.

由于存在这些困难,我想提出一系列StackOverflow问题,这些问题可以作为收集与传统蒙古应用程序开发相关的一些更困难的编程问题的答案的中心位置.即使您没有蒙古语识字,我们也会感谢您帮助查看代码,提出意见和问题,给出答案甚至对问题进行投票.

蒙古文垂直TextView

蒙古语TextView需要满足以下要求:

  • 支持传统的蒙古语字体
  • 从上到下垂直显示文本
  • 换行从左到右.
  • 换行发生在一个空间(与英语相同)

(由于TypeFace可以在以后设置,因此TextView支持Mongolian字体不是绝对的要求,但是在使用许多TextView时它很方便.)

我的答案如下,但我欢迎其他方法来解决这个问题.

本系列中的其他相关问题:

iOS版:

android vertical-text textview mongolian-vertical-script

6
推荐指数
1
解决办法
989
查看次数

Android中如何制作传统蒙古文ListView

如何在Android应用程序中为垂直蒙古文字制作水平滚动的ListView?

背景

Android 对世界上许多语言都有相当好的支持,甚至是阿拉伯语和希伯来语等 RTL 语言。然而,没有像传统蒙古语这样的对自上而下的语言的内置支持(在内蒙古仍然很活跃,不要与西里尔蒙古语混淆)。下图显示了文本方向,为清楚起见添加了英文。

在此输入图像描述

由于此功能未内置于 Android 中,因此应用程序开发的几乎每个方面都变得极其困难。对于水平 ListView 来说尤其如此,Android 中不支持开箱即用的水平 ListView。网上提供的信息也非常非常少。有许多传统蒙古文的应用程序开发人员,但无论是出于商业原因还是其他原因,他们似乎都没有将其代码开源。

由于这些困难,我想提出一系列 StackOverflow 问题,这些问题可以作为收集与传统蒙古应用程序开发相关的一些更困难的编程问题的答案的中心位置。即使您不懂蒙古语,我们也将不胜感激您帮助审查代码、提出评论和问题、给出答案甚至对问题进行投票。

蒙古文垂直滚动ListView

蒙古文ListView需要满足以下要求:

  • 从左向右水平滚动
  • 触摸事件的工作方式与普通 ListView 相同
  • 与普通 ListView 一样支持自定义布局

还需要支持蒙古文 TextView支持的所有内容:

  • 支持传统蒙古文字体
  • 从上到下垂直显示文本
  • 换行是从左到右。
  • 换行出现在空格处(与英语相同)

下图展示了蒙古文ListView应具备的基本功能:

在此输入图像描述

我的答案如下,但我欢迎其他解决此问题的方法。

本系列其他相关问题:

iOS:

android listview vertical-text horizontal-scrolling mongolian-vertical-script

5
推荐指数
1
解决办法
534
查看次数