問題タブ [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 - SwiftでiOS用の垂直テキストUILabelとUITextViewを作成するにはどうすればよいですか?
タイトルに基づいてこの質問に来たが、モンゴル語に興味がない場合は、代わりにこの Q&A を探している可能性があります。
伝統的なモンゴル語の iOS アプリを開発するために Swift を学習しています。問題は、伝統的なモンゴル語が上から下、左から右に縦に書かれていることです。私の質問は、テキストを垂直に表示し、行の折り返しが機能するようにするにはどうすればよいですか?
1 分間お付き合いいただければ、問題をより明確に説明できるように努めます。以下は、私が達成したいテキストビューの種類の画像です。外国語のスクリプトにうんざりした場合に備えて、同じパターンに沿った英語のテキストを含めました。実際、アプリに表示する英語のテキストがある場合は、このように表示されます。
単純な 1 行の UILabel の場合、時計回りに 90 度回転すると機能します。ただし、複数行の UITextView の場合、行の折り返しを処理する必要があります。単純に 90 度回転させると、最初に書かれたものが最後の行になってしまいます。
これまでのところ、この問題を克服できると思われる計画を立てました。
- すべての文字が垂直方向に反転するカスタム フォントを作成します。
- テキスト ビューを時計回りに 90 度回転します。
- テキスト ビューを水平方向にミラーリングします。
これでテキストの折り返しが処理されます。
ミラーフォントができます。ただし、UITextView の回転とミラーリングのために Swift コーディングを行う方法がわかりません。ソリューションの一部にヒントを与えると思われる次のリンクを見つけましたが、それらはすべて Objective C にあり、Swift にはありません。
アプリ ストアには伝統的なモンゴル語のアプリ (これやこれなど) がありますが、ソース コードを共有している人をまだ見つけていないため、テキストを表示するために舞台裏で何をしているのかわかりません。伝統的なモンゴル語を読む数百万人の人々のためのアプリを開発するのが将来、それほど難しくないように、私は自分のコードをオープンソースにするつもりです。私だけでなく、モンゴルの人々も、この努力にあなたが与えることができるどんな支援も大いに感謝します. 自分のことを知らない場合でも、この質問に賛成票を投じて、より目立つようにすることが役立ちます.
アップデート
@sangonzの答えはまだ素晴らしい答えですが、すべてを機能させることができなかったため、受け入れられた答えとして一時的にマークを外しました。具体的には:
- スクロールを有効にする (スクロールビューにカスタム ビューを埋め込むか、UIScrollView をサブクラス化することにより)。github プロジェクトで、@sangonz はこれは簡単なはずだと言いましたが、私には合いませんでした。
- 向きの変更時にワード ラインの (ストレッチではなく) 再レイアウトを取得します。これは、もう少し研究すれば解決するのはそれほど難しいことではないと思います。
- テキスト行がビューの端まで届かないのはなぜですか? 底に大きな隙間があります。
カスタム垂直ビューの NSTextStorage を他の UITextView からリンク解除する方法。(この質問を参照してください)
この時点まで、私は上で提案した元の方法を使用してきましたが、私が本当に望んでいるのは、@sangonz が提案したようなものを機能させることです。
私は現在、次のような代替方法も検討しています
- Core Text の使用, 短所: 車輪の再発明のように感じる
- WebKit の使用、欠点: Apple は WebKit を使用しなくなりました。
UITextView
android - Android で伝統的なモンゴル文字 TextView を作成する方法
Androidアプリ用の縦型(左から右への行折り返し)のモンゴル語スクリプトTextViewをどのように作成しますか?
バックグラウンド
Android は、アラビア語やヘブライ語などの RTL 言語を含め、世界中の多くの言語をかなり適切にサポートしています。ただし、伝統的なモンゴル語のような上から下までの言語の組み込みサポートはありません(内モンゴルではまだ非常に生きており、キリルモンゴル語と混同しないでください)。次の図は、わかりやすくするために英語を追加したテキストの方向を示しています。
この機能は Android に組み込まれていないため、アプリ開発のほぼすべての側面が非常に困難になります。また、オンラインで入手できる情報は非常に少ないです。(関連する SO に関する数少ない質問の 1 つでさえ、適切な回答がありません。) 伝統的なモンゴル語のアプリ開発者は数多くいますが、商業的な理由かどうかにかかわらず、コードをオープン ソースにしていないようです。
これらの困難のため、伝統的なモンゴルのアプリ開発に関連するいくつかのより困難なプログラミングの問題に対する回答を収集するための中心的な場所として役立つ一連の StackOverflow の質問を作成したいと思います。モンゴル語の読み書きができなくても、コードのレビュー、コメントや質問の作成、回答の提供、さらには質問への賛成投票を手伝っていただければ幸いです。
モンゴル語の縦型 TextView
モンゴル語の TextView には、次の要件が必要です。
- 伝統的なモンゴル語フォントをサポート
- テキストを上から下に垂直に表示します
- 行の折り返しは左から右に進みます。
- スペースで改行する(英語と同じ)
(TypeFace は後で設定できるため、TextView がモンゴル語フォントをサポートすることは絶対的な要件ではありませんが、多くの TextView が使用されている場合に便利です。)
私の答えは以下ですが、この問題を解決する他の方法を歓迎します。
このシリーズのその他の関連する質問:
- Android で伝統的なモンゴル文字 EditText を作成する方法
- Android で伝統的なモンゴル文字 ListView を作成する方法
- 今後も... (トースト、ダイアログ、メニュー)
iOS:
android - Android で伝統的なモンゴル文字 ListView を作成する方法
Androidアプリで垂直モンゴル語スクリプトの水平スクロールListViewを作成するにはどうすればよいですか?
バックグラウンド
Android は、アラビア語やヘブライ語などの RTL 言語を含め、世界中の多くの言語をかなり適切にサポートしています。ただし、伝統的なモンゴル語のような上から下までの言語の組み込みサポートはありません(内モンゴルではまだ非常に生きており、キリルモンゴル語と混同しないでください)。次の図は、わかりやすくするために英語を追加したテキストの方向を示しています。
この機能は Android に組み込まれていないため、アプリ開発のほぼすべての側面が非常に困難になります。これは特に、Android でそのままではサポートされていない水平の ListView に当てはまります。また、オンラインで入手できる情報は非常に少ないです。伝統的なモンゴル語のアプリ開発者は数多くいますが、商業的な理由かどうかにかかわらず、コードをオープン ソース化していないようです。
これらの困難のため、伝統的なモンゴルのアプリ開発に関連するいくつかのより困難なプログラミングの問題に対する回答を収集するための中心的な場所として役立つ一連の StackOverflow の質問を作成したいと思います。モンゴル語の読み書きができなくても、コードのレビュー、コメントや質問の作成、回答の提供、さらには質問への賛成投票を手伝っていただければ幸いです。
垂直スクリプトを使用したモンゴル語の水平スクロール ListView
モンゴル語の ListView には、次の要件が必要です。
- 左から右に水平にスクロールします
- タッチ イベントは、通常の ListView と同じように機能します
- カスタム レイアウトは、通常の ListView と同じようにサポートされます
また、モンゴルの TextViewがサポートするすべてのものをサポートする必要があります。
- 伝統的なモンゴル語フォントをサポート
- テキストを上から下に垂直に表示します
- 行の折り返しは左から右に進みます。
- スペースで改行する(英語と同じ)
以下の画像は、モンゴル語の ListView に必要な基本機能を示しています。
私の答えは以下ですが、この問題を解決する他の方法を歓迎します。
このシリーズのその他の関連する質問:
- Android で伝統的なモンゴル文字 TextView を作成する方法
- Android で伝統的なモンゴル文字 EditText を作成する方法
- 今後も... (トースト、ダイアログ、メニュー)
iOS:
ios - SwiftでUIScrollViewからサブクラス化して垂直UITextViewを作成する方法は?
バックグラウンド
私は iOS 開発は初めてですが、縦書きのモンゴル文字を使用して最も初歩的なアプリを作成するためには、縦書きのUITextView
. コードを共有している他のモンゴルのアプリ開発者を見つけられなかったので、自分で作ろうとしています。次の図に示すように、モンゴル語は上から下に書かれ、行は左から右に折り返されます。
スクロールは水平 (左から右) にする必要があります。
以前の質問で、私はミラー化されたフォントと回転とミラーリングの組み合わせを提案しましたUITextView
(それは私が Android で行ったことだからです)。ただし、この回答を読んで、iOS のやり方 ( の使用などTextKit
)をさらに調査した後UIVerticalTextView
、通常のUITextView
. そして、UITextView
UIScrollView からの継承を確認したので、サブクラス化UIScrollView
してUIVerticalTextView
.
今いる場所
上記の答えはサブクラス化さUIView
れましたが、スクロールを機能させるのに苦労していました。これが、サブクラス化するもう 1 つの理由ですUIScrollView
。また、そのソリューションは、向きが変わったときに各行の単語を再レイアウトしませんでした。
以下の部品を集めましたが、それらを組み合わせる方法がわかりません。
- NSTextStorage - これと何も変わらないはずです。モンゴル語の Unicode テキストとスタイル情報だけを保存します。
- NSTextContainer - 垂直テキスト コンテナーのサイズを指定するには、高さと幅を切り替える必要があります。(とにかく、そう思います。これがどこかでできる場合を除きます。)
- NSLayoutManager - ここで何か特別なことをする必要がありますか、それとも によって処理され
UIVerticalTextView
ますか? UIVerticalTextView - これはのサブクラスになりますが、
/li>UIScrollView
追加および/またはオーバーライドする必要があるメソッドは何ですか?
アップデート
これらの質問は、問題をより小さな部分に分解しようとする試みです。
そして別のアプローチで試してみてください:
- 回転したビューは自動レイアウトと互換性がありますか?
- layoutSubviews でのビューの回転これには実際に有効な解決策があります。ただし、基本的には、3 つのビューを互いに積み重ねる必要があります。現在の質問で提示したように、TextKit を使用するカスタム UIScrollView サブクラスを作成したいと思います。
ios - IB ではカスタム フォントが表示されるが、シミュレーターでは表示されない
UITextView
aと aUILabel
をカスタム フォントを使用するように設定しました。(これは縦にミラーリングされたモンゴル語フォントですが、効果がわかるように英語のテキストも含めました。) Interface Builder では単語が表示されますが、シミュレーターではほとんどの文字がUITextView
空のボックスになっています。奇妙なことに、UILabel
do の文字はシミュレーターで正しく表示されます。
UITextView
それらを同様に表示するにはどうすればよいですか?
ノート:
- Xcode バージョン 6.3.2 を使用しています。この SO Q&Aから、カスタム フォントは IB の Xcode 6 で動作するはずであることがわかりました。
UITextView
プロジェクトにフォント ファイルを追加し、と の両方のカスタム フォント リストから選択しましたUILabel
。- プロジェクトに「アプリケーションによって提供されるフォント」キーを追加し、
Info.plist
それにカスタムフォントを追加しました。 この質問
/li>UITextView
は非常に似ています(ただし、問題について言及していないため異なりUILabel
ます)。この記事の執筆時点では、その質問の OP は、投票数の多い回答が役に立ったかどうかを示していません。その回答のコードを実行して、フォントが本当にバンドルに含まれていることを確認しました。バンドルに含まれていることを確認する次の結果が得られたため、それでも問題は解決しません。
誰かが私の間違いを見たり、他のアイデアを持っていますか?
アップデート
@darkheartfeltの反対票を受け取り、以下の私の回答にコメントした後、何かを見逃したのではないかと考えて、元の問題を再現しました。iOS 9 では、シミュレーターでのフォントの表示が多少異なりますが、基本的な問題は依然として存在します。IB では問題なく表示されますが、シミュレーターでは表示されません。
問題は次のように再現できます (Xcode 7.1.1 を使用)。
- 新しいシングル ビュー プロジェクトを開始します。
- プロジェクトにフォントを追加します (関連する github プロジェクトからダウンロードできます)。
- Info.plist ファイルに、「アプリケーションが提供するフォント」をフォント名「ChimeeWhiteMirrored.ttf」で追加します。
- ターゲットの「Copy Bundle Resources」に ChimeeWhiteMirrored.ttf が含まれていることを確認します。
- をストーリーボードに追加し
UITextView
ます。 - IB 属性インスペクターに次のテキストを貼り付けます。
1-10: one two three four five six seven eight nine ten
- IB Attributes インスペクターで、フォントを Custom に、ファミリーを ChimeeWhiteMirrored に設定します。
これにより、特殊文字の問題が再現されます。以下の回答で説明したように、この問題を解決する唯一の方法は、コードでフォントを設定することです。
私が間違っているか、何かが欠けている場合は、お知らせください。それまでは、以下の受け入れられた回答を引き続き使用する必要があります。
ios - Swift での Unicode コード ポイントの操作
モンゴル語の詳細には興味がなく、Swift での Unicode 値の使用と変換に関する簡単な回答が必要な場合は、受け入れられた回答の最初の部分までスキップしてください。
バックグラウンド
iOS アプリで使用する伝統的なモンゴル語の Unicode テキストをレンダリングしたいと考えています。より優れた長期的な解決策は、この複雑なスクリプトをレンダリングするAAT スマート フォントを使用することです。(そのようなフォントは存在しますが、それらのライセンスは変更や非個人的な使用を許可していません。)しかし、私はフォントを作成したことがないので、AAT フォントのすべてのレンダリング ロジックは言うまでもなく、自分でレンダリングを行う予定です。とりあえずスイフト。後日、スマートフォントの作り方を学べるかもしれません。
外部的には Unicode テキストを使用しますが、内部的に ( で表示するためにUITextView
) Unicode を個々のグリフに変換し、ダム フォント (Unicode PUA値でコード化) に保存します。したがって、私のレンダリング エンジンは、モンゴル語の Unicode 値 (範囲: U+1820 から U+1842) を PUA に格納されているグリフ値 (範囲: U+E360 から U+E5CF) に変換する必要があります。とにかく、これは私が過去に Java で行ったことなので、私の計画ですが、考え方全体を変える必要があるかもしれません。
例
次の画像は、文字u (赤)の 2 つの異なる形式を使用して、モンゴル語で 2 回書かれたsuを示しています。(モンゴル語は英語の草書体のように文字が縦につながって書かれています。)
Unicode では、これら 2 つの文字列は次のように表されます。
Free Variation Selector (U+180B) はsuForm2
、Swift によって (正しく) u (U+1826) が先行するString
ユニットとして認識されます。Swift では、拡張された書記素クラスターである単一の文字と見なされます。ただし、レンダリングを自分で行うために、u (U+1826) と FVS1 (U+180B) を 2 つの異なる UTF-16 コード ポイントとして区別する必要があります。
内部表示のために、上記の Unicode 文字列を次のレンダリングされたグリフ文字列に変換します。
質問
私はSwiftString
とCharacter
. それらには便利なことがたくさんありますが、私の特定のケースでは、UTF-16 コード単位のみを扱っているため、NSString
Swift のString
. String.utf16
を使用して UTF-16 コード ポイントを取得できることはわかっていますが、 への変換String
はあまりうまくいきません。
String
andに固執する方が良いでしょうか、それともandCharacter
を使用する必要がありますか?NSString
unichar
私が読んだこと
この質問への更新は、ページを整理するために非表示にされました。編集履歴を参照してください。
ios - Swift でのカスタム UIView の読み込み時間が遅い
バックグラウンド
縦スクロールのモンゴル文字を横スクロールするテキストビューを作るために、カスタムUIView
サブクラスを作りました。このクラスは を取り、UITextView
それを にUIView
入れ、そのビューを回転および反転させてから、そのビューを 親 に入れUIView
ます。
回転と反転の目的は、テキストが垂直になり、行の折り返しが正しく機能するようにすることです。すべてを親に貼り付ける目的はUIView
、自動レイアウトがストーリーボードで機能するようにすることです。(詳細はこちらをご覧ください。)
コード
私は実用的な解決策を得ました。github の完全なコードはこちらにありますが、新しいプロジェクトを作成し、問題を切り分けるためにできる限り不要なコードをすべて取り除きました。次のコードは、上記の基本的な機能を引き続き実行しますが、以下に説明する読み込みが遅いという問題もあります。
問題
カスタム ビューの読み込みが非常に遅いことに気付きました。私は Xcode Instruments を初めて使用するので、役に立つビデオDebugging Memory Issues with Xcode and ProfilerおよびTime Profilerを見ました。
その後、自分のプロジェクトで問題を見つけようとしました。Time Profiler、Leaks、Allocations ツールのいずれを使用しても、クラスinit
メソッドの処理が多すぎることがわかります。(しかし、以前の読み込み時間が遅いことから、それはすでに知っていました。)これは、割り当てツールのスクリーンショットです。
収まらないため、呼び出しツリーのすべてを展開しませんでした。なぜこれほど多くのオブジェクトが作成されるのでしょうか? 3 層のカスタム ビューを作成したとき、それが理想的ではないことはわかっていましたが、コール ツリーから発生しているように見える層の数はばかげています。私は何を間違っていますか?
ios - セルの高さが可変のUITableView:IBで動作するが、プログラムでは動作しない
TL;DR
UITableViewAutomaticDimension
上部と下部の両方の制約を使用および設定しているにもかかわらず、プログラムで作成したテーブル ビュー セルが、カスタム ビューの本質的なコンテンツの高さに応じてサイズ変更されません。
問題はおそらく、UITableViewCell
サブクラスの実装にあります。以下のコードを参照してください。プログラムで動作しない > コード > MyCustomCell.swift .
ゴール
カスタムのモンゴル語キーボードの提案バーを作成しようとしています。モンゴル語は縦書きです。Android では、次のようになります。
進捗
UITableView
iOS 8 以降で利用可能な可変セルの高さで を使用する必要があることを学びました。これには、自動レイアウトを使用し、セルの高さに自動寸法を使用するようにテーブル ビューに指示する必要があります。
途中で学ばなければならなかったいくつかのことは、最近の SO の質問と回答に示されています。
- カスタム テーブル ビュー セルの作成方法
- 標準のテーブル ビューで可変高さを取得する
UILabel
- カスタム ビューで機能する固有のコンテンツ サイズを取得する
- プログラムで作成された
UITableViewCell
- プログラムで制約を設定する
そのため、固有のコンテンツ サイズをサポートする垂直ラベルを使用できるようになりました。これらのラベルは、カスタム テーブル ビューのセルに入れられます。また、次のセクションで説明するように、ストーリーボードで実行すると機能しますが、プログラムですべてを作成すると機能しません。
IBで働く
問題を切り分けるために、2 つの基本的なプロジェクトを作成しました。1 つはストーリーボードを使用するプロジェクトで、もう 1 つはプログラムですべてを実行するプロジェクトです。ストーリーボード プロジェクトが機能します。次の図に示すように、各テーブル ビュー セルは、カスタム垂直ラベルの高さに合わせてサイズ変更されます。
IBで
上部と下部を固定し、ラベルを中央に配置するように制約を設定しました。
コード
ViewController.swift
MyCustomCell.swift
プログラム的に動作しません
提案バーを最終的なキーボードの一部にしたいので、プログラムで作成できる必要があります。ただし、上記のサンプル プロジェクトをプログラムで再作成しようとすると、機能しません。次の結果が得られます。
セルの高さのサイズが変更されておらず、カスタムの垂直ラベルが互いに重なっています。
次のエラーも表示されます。
警告は 1 回のみ: テーブルビュー セルのコンテンツ ビューの高さがゼロであることを制約が曖昧に示唆しているケースが検出されました。意図しない崩壊を考慮し、代わりに標準の高さを使用しています。
このエラーは、スタック オーバーフローで何度も発生しています。
- iOS8 - 制約があいまいにゼロの高さを示唆している
- 制約があいまいにゼロの高さを示唆しているケースを検出しました
- カスタム UITableviewcell の高さが正しく設定されていません
- iOS 8 (UITableViewCell) : 制約は、テーブルビュー セルのコンテンツ ビューの高さゼロをあいまいに提案します
しかし、これらの人々のほとんどの問題は、上下両方のピン制約を設定していないことです。以下の私のコードに示されているように、私はそうです、または少なくとも私はそうだと思います。
コード
ViewController.swift
MyCustomCell.swift
これがIBプロジェクトとの主な違いであるため、問題はおそらくここにあると思います。
補足コード
上記の両方のプロジェクトで使用したカスタム垂直ラベルのコードも含めますが、IB プロジェクトは機能するため、主な問題はここにはないと思います。
アップデート
プロジェクトのコード全体はすべてここにあるので、試してみたいという人がいる場合は、新しいプロジェクトを作成し、上記のコードを次の 3 つのファイルにカット アンド ペーストしてください。
- ViewController.swift
- MyCustomCell.swift
- UIMongolSingleLineLabel.swift