【Swift3】UITextViewでテキストを省略表示する

テキストの省略表示(例:であるが、しかし…)をUITextViewでやりたかったけど、出てくるのはUILabelの話ばかり・・・。

で、ようやくわかりました。わかってみれば至極カンタン。

UITtextView.textContainer.lineBreakMode = .byTruncatingTail
UITtextView.textContainer.maximumNumberOfLines = 2;

「maximumNumberOfLines」は最大行数の指定で、上の指定だと2行目の最後が省略表示になります。指定しなければ、UITtextViewのサイズからはみ出す場合に省略表示がつきます。

一番最初のサイトが参考になりました。感謝。一番最後のコードで対応する方も試してみたけど、Universalで且つTableViewのcellで使いたかったのでボツに。

【参考】
UITextViewのわるいところ|まいちはシステム屋さん
byTruncatingTail – NSParagraphStyle.LineBreakMode | Apple Developer Documentation
[Swift3]長すぎる文字列の後方を省略する

Swiftの確認事項もろもろ(2)

引き続きガリガリやってます。ブラウザのタブも一杯になってきたので、第2弾です。

・自分用のアプリでは、関数作ってたけどその時間もないので。備忘録的に。
RGBの16進数表記をUIColorのコードに変換してくれるサービス。 » ブロードヒューマンネットワーク社員ブログ

・カンタンお手軽。速度的にはどうなんすかね?
【Swift】配列内で重複する要素を除去する – Qiita

・ソートです。明示的にソートしないと、Controller間で要素順が変わってしまうと事象があったので。
【Swift】配列をソートする方法(昇順・降順・逆順) | Fussan Blog

・UITextViewでのHTML表示関連
UITextViewにHTMLを表示する(Swift3版) – Qiita
[Swift] URLエンコード URLデコード: スタジオプリズム㐧3ブログ
Decode HTML string in Swift 3 – Stack Overflow

・String操作いろいろ
[Swift3] Stringのプロパティ/メソッドのまとめ (文字列操作) – Qiita

・正規表現など
Swiftで正規表現を使って文字列を置換する – Qiita

・配列周りなど
Swiftの配列操作(map,reduce,filter) – Qiita

・extensionってなんすか?
エクステンション | Swift言語を学ぶ

・こんなことできるんですね。タブなんかを外側に表示するのに便利。
UITableViewCellの領域外にUIをはみ出させたい – Qiita

・for in もおさらい。
Swift さくっと確認したい基礎文法 [いろんなループ処理] – Qiita

・特殊文字の置換
Unescape HTML special characters of String in Swift

・TableCellの表示位置チェック
【iOS】特定のセルがUITableViewの表示領域内に収まっているかどうかを調べる

・Constraintは初めていじりました。
NSLayoutConstraintをプログラムでシンプルに書く – Qiita

Swiftの確認事項もろもろ(1)

急遽、Swiftを実戦投入(要は仕事)することになったので、諸々メモです。

・Calendarである日付を起点にいろいろ操作できるのは便利。
Swift3での日時に関する処理 – Qiita

・mapに出てくる「$0」の意味がわからなかった(笑)
特有の関数? mapとは?$0とは? – “まだ”の力 [Swift]基礎辞書

・演算子も改めて再確認。
【Swift】演算子の使い方。論理演算、比較演算、代入演算、ビット演算 | はじはじアプリ体験記

・私の場合も「nilなのは値じゃなくて変数だった」でした。
明らかにnilじゃないのに「unexpectedly found nil〜」が出る

・この辺もObjective-Cにはないので、混乱しがち。
[Swift] Optional 型についてのまとめ Ver2 – Qiita

・DateFormatterの使い方もろもろ
【Swift】Dateの王道 【日付】 – Qiita
日付操作の基本 – Swiftをはじめよう!

【CreateJS】AS3からHTML5 Canvasに書き出す場合のJavaScript(その3)2017年版

【MacOS Seria+Adobe Animate CC 2017.5リリース】
swfで作ったコンテンツをHTML5 Canvasに書き出すお勉強のその3です。

その2から随分間が空きましたが(笑)、ちょうど以前開発したAS3コンテンツをまとめてCanvas化する仕事があって、思い出しつつ調べつつ作業したので、2017年10月の時点でどのように変換したかをまとめておきます。

前提とするコンテンツは下記のようなものです。

・Flash IDE(いわゆる純正のFlashアプリケーション)で作成されたもの。
・スクリプトを外部ファイル化していない(関数などは1フレーム目にまとめて定義)。
・タイムラインとActionScriptを併用している(定義した関数や変数をフレームで呼び出すようなもの)

ちょっとしたインタラクションとアニメーションを絡めたようなコンテンツは、わざわざクラスファイルを外部化するのも面倒だし、こういう作り方してる人も多いんじゃないかと思います。FlashDevelopやFlash Bulderなんかでガリガリ作ったものは、その筋の人たちにお任せします(笑)。

0.FlaファイルをCanvas形式に変換する。

コマンド>他のドキュメント形式に変換 を選択します。

ドキュメントタイプコンバーターで「HTML5 Canvas」を選択してファイル名、保存場所を指定してOKを押します。

ドキュメントタイプコンバーターのポップアップ

※この時、全てのActionScriptはコメント化されます。「this.stop();」などそのまま使えるものもコメント化されるので要注意。

1.型は全て削除する(:uint や as MovieClipなど)。

JavaScriptにはないので当然ですね。アクションパネルなどで一括置換が漏れがなくてオススメです。

2.タイムラインのどこからでも使いたいものは、アクション>グローバル>スクリプトに書く(のグローバル化)

1フレーム目に関数(function)を書いて、別のフレーム(例えば10フレーム目)で呼び出すのは、ASではよくやりますが、これがそのままではJavascriptで動きません。その場合は、アクションパネルでアクション>グローバル>スクリプトを開いて、ココに書きます。ココに書かれた変数や関数はグローバル化されるので、this参照なしでどこからでも呼び出せます。

アクションパネルの左側から、グローバル>スクリプトを選択します。

・スクリプト例(定義:グローバル>スクリプト)

//---アニメフラグ
var flg_anime = true;

//ボタン:切替
function switchBtn(flg)
{
	if (flg)
	{
		//アニメーション開始;
		startAnimation();
	}
}

・スクリプト例(呼び出し;フレームスクリプト)

//ボタン:初期化
switchBtn(flg_anime);

※ flg_anime, switchBtn()共にグローバルなので、this等の修飾なしで使用できる。

グローバル>スクリプトの関数で、ステージ上に配置されたMovieClipやボタン、ステージのタイムラインなどを使用する場合は、exportRootで参照します。

・スクリプト例(定義:グローバル>スクリプト)

//アニメーション開始
function startAnimation()
{
	exportRoot.gotoAndPlay("f_anime");
}

3.MovieClip内の関数

タイムラインが1フレームしかないもので、MovieClip内で完結する変数、関数は、そのままthis等の参照なしでフレームに書いてOK。
・そのMovieClip内に閉じたものは、function xxx(){} で定義したものをthis.xxx()で参照すればよい。

・スクリプト例(MovieClip;フレームスクリプト)

//何か例を入れる

但しMovieClipの外部から参照する変数、関数はプロパティにする必要があります。
・this.xxx = function(){} な書き方。

//何か例を入れる

4.プロパティパネルに書いたインスタンス名は参照出来ない。

ボタンやMovieClipでインスタンス名で参照したいときは、明示的にnameプロパティに文字列を設定する必要があります。

・スクリプト例(定義:グローバル>スクリプト)

//ボタン:初期化
function inithBtn()
{
	exportRoot.btn_up_year.name = "btn_up_year";
	exportRoot.btn_up_month.name = "btn_up_month";
	exportRoot.btn_up_day.name = "btn_up_day";
}

※MovieClipなら、MovieClip内のフレームで、this.name = “xxx” でも定義できる。

5.円形グラデーションやフィルターなどは使えない。

・HTML5 Canvasに書き出すのに制限があります。ライブラリ上でビットマップに変換しておくか、場合によってはビットマップで作り直す必要があります。

6.MouseEvent.MOUSE_UP >> pressup

・ここは “mouseup” じゃないので要注意。

処理 AS JavaScript
クリック MouseEvent.CLICK click
マウスオーバー MouseEvent.MOUSE_OVER mouseover
マウスアウト MouseEvent.MOUSE_OUT mouseout
マウスダウン MouseEvent.MOUSE_DOWN mousedown
マウスアップ MouseEvent.MOUSE_UP pressup
ロールアウト MouseEvent.ROLL_OUT rollout

7.Movieclip内の関数でのthis参照

関数内でのthisを参照すると、ページのルートであるWindowを指します(詳しくは、別記事の「4.thisの参照」を参照のこと)。
MovieClip内の関数で、相対的にパスを指定したいときは、関数外で変数にthisを入れておき、それを使って参照します。

・スクリプト例(定義:MovieClip内のフレームスクリプト)

//関数内での参照用にthisを変数化
var my_mc = this;

//初期化
this.init = function ()
{	
	my_mc.open_cap.visible = false;
	my_mc.close_cap.visible = false;

}

8.MovieClipボタンのカーソル対応

“buttonMode” は”cursor”に変更します。

処理 AS JavaScript
指カーソルにする MovieClip.buttonMode = true; MovieClip.cursor = “pointer“;
デフォルトカーソルにする MovieClip.buttonMode = false; MovieClip.cursor = “default“;

9.TFLは使えない。

・強制的に普通のテキストに変換されるので、注意が必要です。

10.Dateオブジェクトの扱いに注意

ActionScriptにもJanaScriptにも同じようにDateオブジェクトがありますが、年月日時分秒を取得する際に、ActionScriptはプロパティで、JavaScriptはfunctionのため、微妙に違うので要注意。

処理 AS JavaScript
Dateオブジェクト生成 var date:Date = new Date(); var date = new Date();
年(4桁) date.fullYear date.getFullYear()
date.month date.getMonth()
date.date date.getDate()
date.hours date.getHours()
date.minutes date.getMinutes()
date.seconds date.getSeconds()

11.MovieClipのwidth,height

MovieClip.nominalBoundsで取得可能です。

・スクリプト例(定義:MovieClip内のフレームスクリプト)

this.tft07.nominalBounds.width
this.tft07.nominalBounds.height

【参考】
・X-LABO: Toolkit for CreateJS & Haxe : シンボルの初期表示サイズ・位置情報取得 nominalBounds
・Animate CCで書きだしたCreateJSのグラフィックスの色をプログラム上から変更する – Qiita

createjs – How to change the width of a movieclip in flash html5 canvas? – Stack Overflow

12.MovieClipをリストアップする

多くのMovieClipを配置して制御する場合、ひとつずつに名前をつけたりするのも大変なので、MovieClipだけを配列化して使う場合があります。

・ActioScript例

function initBit():void
{
	array_bit = [];
	
	for (var i:uint=0; i<this.numChildren; i++)
	{
		var ds:DisplayObject = this.getChildAt(i);

		if (ds is MovieClip)
		{
			array_bit.push(ds);
			ds.visible = false;
		}
	}

}

この「is MovieClip」がjavaScriptにないので、どうしようかな?と考えて、MovieClipにはtimelineが存在するので、それを代替にしてMovieClipのみをリストアップすることにしました。まあ気づけばたいした話ではないんですが。

・JavaScript例

his.initBit = function ()
{
	array_bit = [];
	
	for (var i=0; i<this.numChildren; i++)
	{
		var ds = this.getChildAt(i);

		if (!!ds.timeline)
		{
			array_bit.push(ds);
			ds.visible = false;
		}
	}
}

だいたいこんなところだと思いますが、抜けがあったらまた更新します。

以前書いたブログもよければご参考に。

【CreateJS】AS3からHTML5 Canvasに書き出す場合のJavaScript(その1) | AS blind side
【CreateJS】AS3からHTML5 Canvasに書き出す場合のJavaScript(その2) | AS blind side

【追記】
早速、12.を追記しました(2017.10.11)。