QuartzFun(7)~サンプルコードとの差異

2011. 08. 29
これまで説明した初版の内容と原著のサンプルコード(iOS 3.x版は『Beginning iPhone 3 Development Exploring the iPhone SDK』、iOS 4.x版は『Beginning iPhone 4 Development Exploring the iOS SDK』)との差異を見てみます。


●カテゴリの宣言

ランダム色を生成するメソッドrandomColorはUIColorクラスのカテゴリで宣言・実装していますが、iOS 4.x版のサンプルコードでは、ヘッダファイルUIColor-Random.hでのカテゴリ名が『UIColor_Random』となっています。
(ソースファイルUIColor-Random.mで実装する際のカテゴリ名は他と同じく『Random』)

正常に動作はしているようですが、単なるミスなのか、それともわざと変えてあるのか、だとすれば宣言と実装でカテゴリ名が異なっていても構わないのかは謎です。

またカテゴリのファリル名が『クラス - カテゴリ名』となっていますが、『クラス + カテゴリ名』と命名するのが一般的です。


●πの定義

今回は使用していませんが、定数を定義しているConstants.hで、度とラジアンを変換するdegreesToRadianで、初版では円周率を数値で直打ち(3.14159265358979323846)していますが、iOS 3.x/4.x版では数学関数math.hのマクロM_PIに置換されています。


●ビューコントローラでのカテゴリのインポート

iOS 4.x版では、ビューコントローラQuartzFunViewController.mでカテゴリUIColor-Random.hのインポートを行っていません。

確かに描画色を設定するアクションメソッドchangeColor:は(QuartzFunView.hで宣言している)フラグuseRandomColorは使用していますが、ランダム色を設定するメソッドrandomColorの呼び出しはしていないので、UIColor-Random.hをインポートする必要が無いからだと思われます。


●currentRectメソッドの宣言と実装

描画矩形を保持するcurrentRectメソッドは、初版では読み込み専用プロパティとして宣言し、手動実装するため@dynamicというコンパイラ指示子を使用していました。

iOS 3.x版ではQuartzFunViewクラス内でのみ使用する読み込み専用のメソッドということからか、ヘッダファイルで宣言せず、単に実装しています。

しかしiOS 4.x版では、初版同様に読み込み専用プロパティとして宣言している一方、@dynamicを使用せずに実装しています。

currentRectメソッドは動的に割り当てているわけではありませんので@dynamicは必要ではありません。

いずれの方法でも問題はありませんが、読み込み専用で手動実装ということを考えれば、iOS 3.x版のようにプロパティ宣言をせずに実装するのがシンプルかと思います。
(ただその場合、currentRectを呼び出すメソッドより前に実装するという制限が付きます)


●currentRectメソッドの内容

iOS  4.x版ではcurrentRect内の実装内容が異なります。

初版とiOS 3.x版では、始点firstTouchと終点lastTouchの座標を比較し、左上の原点に則して座標の入れ替えやサイズの絶対値補正をしています。

しかしCGGeometryの概要を見ると『矩形の原点が (0.0 , 0.0) でサイズが (10.0 , 10.0) のものと、矩形の原点が (10.0 , 10.0) でサイズが (-10.0 , -10.0) のものは全く同一になります。』とあり、サイズ指定が負の値、つまり始点から終点へのベクトルが右下方向でなくても構わないことが分かります。

したがってiOS 4.x版では特に補正はせず、原点には始点の座標を、サイズには終点と始点の差を単純に指定しています。


●drawRect:メソッドの内容

iOS 4.x版では、drawRect:メソッド内で描画色currentColorが設定されていない場合の初期化を行っていますが、nibファイルからビューを読み込むinitWithCoder:でcurrentColorの初期化を行っているので、drawRect:内で再度行う必要性は無いと思われます。
(仮に初期化がされていない場合、C言語定数であるColorTabIndexは暗黙的に0(kRedColorTab)になり、redColorに設定されます)

またiOS 3.x版では、drawRect:メソッド内でcurrentRect変数を(currentRectメソッドと同内容で)求めていますが、これも必要性は無いと思われます。


●touchesBegan:withEvent:メソッドでのredrawRectの初期化

iOS 3.x/4.x版では、touchesBegan:withEvent:メソッド内で再描画領域redrawRectの初期化を行っていません。

確かにtouchesBegan:withEvent:の場合は、setNeedsDisplayメソッドで画面全体を再描画するので再描画領域を設定する必要は無いからだと思います。


●touchesMoved:withEvent:メソッドでのredrawRectの補正

iOS 3.x版では、touchesMoved:withEvent:メソッドでも再描画領域redrawRectをCGRectInsetによって線幅分の補正を行っています。

iOS 4.x版では初版と同様にこの補正が行われていないため、ドラッグ中の図形が線幅分小さく描画されますので、この補正は追加するべきです。


●画像サイズ

実動作やソースコードに影響はありませんが、貼り付ける画像iphone.pngがiOS 3.x版は52 x 100ピクセル、iOS 4.x版は24 x 47ピクセルと違っています。

iOS 3.x版)
7515

iOS 4.x版)
7516



参考文献

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る






bose_soundsport_free
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
09 | 2017/10 | 11
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 31 - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

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

Wish List
WACOM


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

bose_soundsport_free
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