メモ帳の作成(2)~テキストビュー

2010. 07. 12
本書の内容とは順番を入れ替えて、最初にテキストビューの説明していきます。


●UITextViewクラス

UITextViewクラスは、複数行のスクロール可能なテキスト領域を実装します。

このクラスは、テキストの表示にカスタムフォント、色、行揃えを使うことができ、またテキストの編集もサポートします。

通常テキストビューは、大規模なテキスト文書などの複数行のテキスト表示に使用します。

このクラスは、複数のスタイルを持つテキストをサポートしません。

指定したフォントや色、行揃えなどの属性は、テキストビューの内容全体に適用されます。

アプリケーションでより複雑なスタイルの表示を行う必要がある場合は、UIWebViewオブジェクトを使用してHTMLでレンダリングしてください。

キーボードの管理

編集可能なテキストビューをタップすると、テキストビューはファーストレスポンダになり、自動的に関連付けされているキーボードを表示するかをシステムに問い合わせます。

なぜならキーボードの外観はユーザインターフェイスの一部を隠してしまうので、隠されてしまういくつかのビューを再配置するかの確認を取るためです。

いくつかのシステムビューは、テーブルビューのように自動的にビューのファーストレスポンダのスクロールを補助します。

もしファーストレスポンダがスクロール領域の底に位置する場合、ファーストレスポンダが確実に見えるように、スクロールビューはリサイズや再配置を行う必要があります。

アプリケーションには、選択時にキーボードを片付ける責任があります。

例えばユーザインターフェイスの特定のボタンをユーザがタップした場合など、指定したユーザアクションに応答してキーボードを片付けることができます。

キーボードを片付けるには、現在のファーストレスポンダであるテキストビューにresignFirstResponderメッセージを送信してください。

それにより、テキストビューオブジェクトは現在の(デリゲートオブジェクトの内容の)編集セッションを終了し、キーボードを隠します。

キーボードの外観は、UITextInputTraitsプロトコルが提供するプロパティを使ってカスタマイズすることができます。

テキストビューオブジェクトはこのプロトコルを実装し、定義されているプロパティをサポートします。

これらのプロパティを使って、ASCIIや数字、URL、Emailなどのキーボードのタイプを指定します。

またキーボードの基本的なテキスト入力動作として、自動での大文字化やテキストの校正をサポートします。

キーボードの通知

システムがキーボードを表示または非表示にする際、いくつかのキーボード通知を行います。

これらの通知はキーボードについての情報としてサイズを含み、ビューの再配置やリサイズの計算に使用することができます。

キーボードに関するいくつかの種類の情報を得る唯一の方法は、これらの通知を登録することです。

システムが提供するキーボード関連のイベントの通知は以下の通りです。

・UIKeyboardWillShowNotification
・UIKeyboardDidShowNotification
・UIKeyboardWillHideNotification
・UIKeyboardDidHideNotification

これらの通知の詳細については、『UIWindow Class Reference』を参照してください。


●UITextViewDelegateプロトコル

UITextViewDelegateプロトコルは、UITextViewオブジェクトの編集に関するメッセージを受信するために使用できる、オプションメソッドのセットを定義します。

このプロトコルのメソッドは全てオプションです。

これらはスペルチェッカープログラムのようにテキストの編集を調整したり、挿入ポイントを修正したい場合に使用することができます。


●メモ帳でのUITextViewクラスの利用

今回のメモ帳アプリケーションでは、

・テキストビューの編集開始時にピッカービューを隠して上部ツールバーを表示
・テキストビューの編集終了時に上部ツールバーを隠す

2つのアニメーションの実装と、

・上部ツールバーの『Done』ボタンを押した際にキーボードを隠すアクションメソッド

の実装を行います。
(キーボードの表示は、テキストビューの編集開始時にシステムにより自動で行われます)

テキストビューの編集の開始および終了は、UITextViewDelegateプロトコルの通知であるtextViewDidBeginEditing:とtextViewDidEndEditing:を利用します。

本書では触れられていませんが、UITextViewDelegateプロトコルを使うのでMemo.hヘッダファイルに念のため追加します。
(太字が追加した部分)

#import <Foundation/Foundation.h>

@interface Memo : NSObject <UITextViewDelegate> {
    // アウトレット
    IBOutlet UITextView *memoView;    // メモ入力用のテキストビュー
    IBOutlet UIPickerView *fontPicker;    // フォント選択用ピッカービュー
    IBOutlet UIImageView *imageView;    // 背景画像用イメージビュー
    IBOutlet UIToolbar *topToolbar;    // 画面上部のツールバー
    IBOutlet UIToolbar *btmToolbar;    // 画面下部のツールバー

    // ピッカービューに表示するデータ
    NSMutableArray *fontNames;    // フォント名一覧
    NSArray *fontSizes;    // フォントサイズ一覧
}
// アクションメソッド
- (IBAction)selectFont;    // フォント選択画面の表示/非表示
- (IBAction)doneMemoEdit;    // メモ編集完了
- (IBAction)clearMemo;    // メモクリア
- (IBAction)showAbout;    // アバウト画面表示

@end

495

それとInterface Builderでテキストビューを選択し、InspectorウィンドウのConnectionsパネルを開き、Memoインスタンスに接続しておきます。

501

続いて3つのメソッドの実装を行います。
(太字が追加した部分)

#import "Memo.h"

@implementation Memo

// テキスト編集開始通知
- (void)textViewDidBeginEditing:(UITextView *)view {
    [fontPicker fadeTo:0.0f];    // ピッカービューをフェードアウト
    [topToolbar fadeTo:1.0f];    // 上部ツールバーをフェードイン
}

// テキスト編集終了通知
- (void)textViewDidEndEditing:(UITextView *)view {
    [topToolbar fadeTo:0.0f];    // 上部ツールバーをフェードアウト
}

- (IBAction)doneMemoEdit {
    [memoView resignFirstResponder];
}

@end

496

アニメーションを行うfadeTo:メソッドはカテゴリで実装しています。

カテゴリは元々、大規模なクラスの定義と実装を種類や内容によって分割するための構造ですが、応用として既存のクラスに新しいメソッドを追加することもできます。
(インスタンス変数の追加はできません)

今回はUIViewクラスにfadeTo:という、フェードイン/アウトのアニメーションを行うメソッドを追加して利用しています。
(fadeTo:メソッドの追加については後述します)


・textViewDidBeginEditing:
(UITextViewDelegateプロトコル)

- (void)textViewDidBeginEditing:(UITextView *)textView

指定したテキストビューの編集が開始されたことをデリゲートに告げます。

このメソッドの実装はオプションです。

テキストビューはデリゲートに、ユーザによるテキストビューの編集が開始された直後の、実際に変更が行われる前にこのメッセージを送信します。

このメソッドは編集関連のデータ構造の設定と、後で編集メッセージを受信するデリゲートの一般的な準備に使うことができます。

textView:編集が開始されたテキストビューを指定します。


・textViewDidEndEditing:
(UITextViewDelegateプロトコル)

- (void)textViewDidEndEditing:(UITextView *)textView

指定したテキストビューの編集が終了したことをデリゲートに告げます。

このメソッドの実装はオプションです。

テキストビューはデリゲートに、実行していた編集が終了した後、ファーストレスポンダの状態が破棄されるとこのメッセージを送信します。

このメソッドはデータ構造の破棄や、編集開始時に設定した状態情報の変更に使うことができます。

textView:編集が終了したテキストビューを指定します。


・resignFirstResponder
(UIResponderクラス)

- (BOOL)resignFirstResponder

レシーバにファーストレスポンダの状態を放棄するよう通知します。

デフォルトの実装ではYESを返し、ファーストレスポンダ状態を放棄します。

サブクラスでこのメソッドをオーバーライドすることができ、選択時に非強調表示にするといったアクションを行ったり、ファーストレスポンダ状態の放棄を断ってNOを返すこともできます。


●カテゴリによる新規メソッドの追加

既存クラスに新規メソッドを追加できるカテゴリ機能を使って、UIViewクラスにfadeTo:というフェードアニメーションを行うメソッドを追加します。

作り方は独自クラスと同様で、Xcodeの『グループとファイル』ペインの『Classes』を右クリックして、コンテキストメニューから『追加』→『新規ファイル』を選択します。

左側ペインで『iPhone OS』の『Cocoa Touch Class』を選択、右上ペインの『Objective-C class』を選択し、右下ペインの『Subclass of』を『UIView』に設定し、名前を『UIViewExtension』とします。

497

カテゴリで既存クラスにメソッドを追加する場合、ヘッダファイル(UIViewExtension.h)のクラス宣言は、既存クラス名と追加するメソッドの内容を表す任意のカテゴリ名を宣言することになります。

インスタンス変数は追加できないので中括弧({})は省略し、追加するメソッドを宣言します。
(太字が追加・修正した部分)

#import <UIKit/UIKit.h>

@interface UIView (AnimationExtension)

- (void)fadeTo:(float)alpha;

@end

498

ソースファイル(UIViewExtension.m)の実装でも、クラス名の部分はヘッダファイルと同様の記述になります。

実装するメソッドの記述法は変わりありません。
(テンプレートとして挿入されているinitWithFrame:やdeallocメソッドは削除してください)

fadeTo:メソッドは、浮動小数点実数を引数としてレシーバのアルファ値(透明度)を変更するメソッドです。
(太字が追加・修正した部分)

#import "UIViewExtension.h"

@implementation UIView (AnimationExtension)

- (void)fadeTo:(float)alpha {
    // アニメーションの準備
    [UIView setAnimationsEnabled:YES];
    [UIView beginAnimations:@"Animation" context:nil];

    // プロパティの変更
    self.alpha = alpha;

    // アニメーションの実行
    [UIView commitAnimations];
}

@end

499

最期に追加メソッドを使えるようにするため、Memo.hにUIViewExtension.hをインポートします。
(太字が追加した部分)

#import "UIViewExtension.h"
#import <Foundation/Foundation.h>

@interface Memo : NSObject <UITextViewDelegate> {
    // アウトレット
    IBOutlet UITextView *memoView;    // メモ入力用のテキストビュー
    IBOutlet UIPickerView *fontPicker;    // フォント選択用ピッカービュー
    IBOutlet UIImageView *imageView;    // 背景画像用イメージビュー
    IBOutlet UIToolbar *topToolbar;    // 画面上部のツールバー
    IBOutlet UIToolbar *btmToolbar;    // 画面下部のツールバー

    // ピッカービューに表示するデータ
    NSMutableArray *fontNames;    // フォント名一覧
    NSArray *fontSizes;    // フォントサイズ一覧
}
// アクションメソッド
- (IBAction)selectFont;    // フォント選択画面の表示/非表示
- (IBAction)doneMemoEdit;    // メモ編集完了
- (IBAction)clearMemo;    // メモクリア
- (IBAction)showAbout;    // アバウト画面表示

@end

500

この時点で『ビルドと実行』を行うと、テキストビューをタップした際にキーボードと上部ツールバーが表示され、『Done』ボタンでそれらが隠れる動作を確認できます。

502

※ 宣言しているアクションメソッドの内3つを実装していないので『Incomplete implementation of class 'Memo'』という警告がでます。


●fadeTo:メソッドの修正

トランジションアニメーション(2)』で説明しましたが、setAnimationsEnabled:、beginAnimations:context:、commitAnimationsメソッドはiOS 4で非推奨となっているので、animateWithDuration:animations:メソッドに置換します。
(太字が修正した部分)

- (void)fadeTo:(float)alpha {
    [UIView animateWithDuration:0.5f animations:^{self.alpha = alpha;}];
}

503

従来4行必要だったアニメーションの記述が1行で済んでしまいます。

アニメーションの同じような記述を簡略化するためという意味では、ここでカテゴリを使う必要性が薄くなるのですが、今回は『カテゴリの追加メソッドを使ってコードを書く』ことが目的ですので、このまま残しておきます。



参考文献

UITextView Class Reference

UITextViewDelegate Protocol Reference

UIResponder Class Reference

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る






コンパニオン20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
03 | 2017/04 | 05
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

コンパニオン20
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR