Pickers(7)~DependentComponentPicker(2)

2010. 10. 08
●ピッカーのフォントサイズの変更

CustomPickerでのpickerView:viewForRow:forComponent:reusingView:メソッドの使用方法は画像に対するもので、文字列のサイズ変更の場合にどうすれば良いのか分からなかったので、ぐぐって見つけた

eFreedom/テキストのサイズの変更方法とコンポーネントの幅は UIPickerView のですか?

Ni chicha, ni limona - 平均から抜けられない僕/ [iPhone][Develop] UIPickerViewでUIViewを表示させるときの座標情報について

上記2つのサイトの情報を元に作ってみました。
(太字が追加した部分)

#pragma mark Picker Delegate Methods
/*
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    if (component == kWitchComponent)
        return [self.witches objectAtIndex:row];
    return [self.arms objectAtIndex:row];
}
*/

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    if (component == kWitchComponent) {
        NSString *selectedWitch = [self.witches objectAtIndex:row];
        NSArray *array = [witchArms objectForKey:selectedWitch];
        self.arms = array;
        [picker selectRow:0 inComponent:kArmsComponent animated:YES];
        [picker reloadComponent:kArmsComponent];
    }
}

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
    if (component == kArmsComponent)
        return 200;
    return 90;
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
    UILabel *componentLabel = [[[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, ([pickerView rowSizeForComponent:component].width - 8.0f), [pickerView rowSizeForComponent:component].height)] autorelease];
    componentLabel.backgroundColor = [UIColor clearColor];
    componentLabel.font = [UIFont boldSystemFontOfSize:16.0];
    componentLabel.adjustsFontSizeToFitWidth = YES;
    if (component == kWitchComponent) {
        componentLabel.text = [self.witches objectAtIndex:row];
        return componentLabel;
    }
    componentLabel.text = [self.arms objectAtIndex:row];
    return componentLabel;
}

860

pickerView:viewForRow:forComponent:reusingView:メソッドは、コンポーネントと行を指定し、要素をビューオブジェクトにできるメソッドです。

UIImageViewといった画像ファイルだけでなく、UILabelを使って任意のフォントやサイズの文字列にすることができます。

pickerView:titleForRow:forComponent:メソッドとは排他利用になるため、pickerView:viewForRow:forComponent:reusingView:メソッドを使用した場合はpickerView:titleForRow:forComponent:メソッドは無効になります。
(上記コードではコメントアウトしています)

まず最初に要素を表示する文字列をUILabelオブジェクトとして生成・初期化します。

initWithFrame:メソッドでビューの矩形領域を作ります。
(initWithFrame:メソッドの詳細は『スライドショーのフルスクリーン化(2)』を参照してください)

矩形領域はCGRect構造体で指定し、原点となるX座標、Y座標、サイズとなる幅と高さを指定し、CGRectMakeで初期化しています。

CGRectMakeはCGGeometry.hで定義されています。

CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
    CGRect rect;
    rect.origin.x = x; rect.origin.y = y;
    rect.size.width = width; rect.size.height = height;
    return rect;
}

矩形領域の原点は(0.0f, 0.0f)、サイズはrowSizeForComponent:メソッドでコンポーネントの行のサイズを取得し、幅はコンポーネントの行幅から(ホイールのエッジ分等を引いて見た目に収まりの良いように)8ピクセル縮め、高さはそのままにしています。

ラベルの背景色はデフォルトでは白になってしまうので、backgroundColorプロパティをclearColorで透明にします。

フォントをボールド(太字)にするにはboldSystemFontOfSize:メソッドを使用するのですが、単純にボールドにするだけにはできず、サイズを指定しなければなりません。

目測ではピッカーのデフォルトのサイズは24のようですが、ここでは(後に幅に合わせてフォントサイズを可変させるので)バランスを考えて16にしています。

また、要素の最大文字数に合わせてフォントサイズを指定すると、少ない文字数のものも小さくなって見栄えが気になったので、行幅に合わせてフォントサイズを変えるようadjustsFontSizeToFitWidthプロパティをYESにしています。

ここまでが両コンポーネント共通のラベルの外観を作る処理で、後はpickerView:titleForRow:forComponent:メソッドと同様に各コンポーネントに条件分岐し、行の文字列をラベルのテキストに設定して返しています。

861

アラートは下図のようになります。

862


・pickerView:viewForRow:forComponent:reusingView:
(UIPickerViewDelegateプロトコル)

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view

指定したコンポーネントの指定した行に使用するビューを、必要に応じてピッカービューから呼び出されます。

戻り値は行の内容として使うビューオブジェクトです。

オブジェクトはUILabelやUIImageView、またはカスタムビュー等、UIViewのサブクラスにすることができます。

前に使用されていたビュー(ビューパラメータ)が適正な場合は、それを返します。

異なるビューを返す場合、以前に使用していたビューは解放されます。

ピッカービューには、行の矩形の中央にビューが返されます。

pickerView:ピッカービューが要求するデータのオブジェクトを表します。

row:コンポーネントの行を識別する、0から始まるインデックス番号を指定します。
行は上から下に番号付けされています。

component:ピッカービューのコンポーネントを識別する、0から始まるインデックス番号を指定します。
コンポーネントは左から右に番号付けされます。

view:この行に使われた以前のビューオブジェクトで、現在非表示でピッカービューにキャッシュされているものを指定します。


・CGRect
(CGGeometry)

struct CGRect {
    CGPoint origin;
    CGSize size;
};
typedef struct CGRect CGRect;

矩形の位置と座標を含む構造体です。

デフォルトのQuartzの座標空間は、原点は矩形の左下角になり、通常右上に向かって拡張されます。

iOSでは多くの場合、座標空間が反転している状況があり、原点が矩形の左上角になり、右下に向かって拡張されます。

origin:矩形の原点となる座標点を指定します。

size:矩形の高さと幅となるサイズを指定します。


・rowSizeForComponent:
(UIPickerViewクラス)

- (CGSize)rowSizeForComponent:(NSInteger)component

指定したコンポーネントの行のサイズを返します。

これは一般的にコンポーネント内の行で用いる際の、表示する最大文字列やビューのサイズを求めるために使用されます。

ピッカービューはこのプロパティの値を、pickerView:widthForComponent:やpickerView:rowHeightForComponent:デリゲートメソッドを呼び出して取得し、キャッシュします。

デフォルトの値は (0,0)です。

component:コンポーネントを識別する0から始まる番号を指定します。


・CGSize
(CGGeometry)

幅と高さの値を含む構造体です。

struct CGSize {
    CGFloat width;
    CGFloat height;
};
typedef struct CGSize CGSize;

width:幅の値

height:高さの値


・backgroundColor
(UIViewクラス)

@property(nonatomic, copy) UIColor *backgroundColor

レシーバの背景色です。

このプロパティの変更はアニメーションすることができます。

デフォルトはnilです。


・UIColorクラス

UIColorオブジェクトは、色と時には不透明度(アルファ値)を表します。

UIColorオブジェクトは色データの格納や、塗りつぶしや描画の際に色を設定するのに使用されます。

UIKitの多くのメソッドは、UIColorオブジェクトを使って色データを指定する必要があり、また一般的に色は貴方が指定する必要があります。

このオブジェクトで色空間を使用する場合は、iOSベースのデバイスで使えるように最適化し、適した描画方法にする必要があります。

ただしCore Graphicsの色や色空間を代わりに使用する場合は、その限りではありません。

ほとんどの開発者にとって、UIColorをサブクラス化する必要はありません。

追加した色空間やカラーモデルをサポートする必要がある場合のみになります。


・clearColor
(UIColorクラス)

+ (UIColor *)clearColor

グレースケールとアルファ値が共に0.0のUIColorオブジェクトを返します。


・font
(UILabelクラス)

@property(nonatomic, retain) UIFont *font

テキストのフォントです。

このプロパティはテキスト文字列全体に適用されます。

このプロパティのデフォルトの値は、システムフォントでサイズが17ポイントになります。
(UIFontのsystemFontOfSize:クラスメソッドを使用した場合)

このプロパティにはnil以外の値を設定する必要があり、nilを指定した場合は例外が発生します。


・boldSystemFontOfSize:
(UIFontクラス)

+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize

標準インターフェイスのアイテムとして使用するため、指定したサイズで太字にしたフォントオブジェクトを返します。

fontSize:フォントのサイズをポイント単位で指定します。
この値は0.0より大きくする必要があります。


・adjustsFontSizeToFitWidth
(UILabelクラス)

@property(nonatomic) BOOL adjustsFontSizeToFitWidth

ラベルの矩形領域に合わせて、タイトル文字列のフォントサイズを縮小させるかをブール値で示します。

通常ラベルのテキストは、フォントプロパティで指定されたフォントで描画されます。

このプロパティがYESに設定され、且つテキストプロパティのテキストがラベルの矩形領域を超える場合、レシーバは文字列が収まるまで、または最小サイズになるまでフォントサイズを縮小します。

このプロパティは、numberOfLinesプロパティが1に設定されている場合のみ有効です。

このプロパティのデフォルト値はNOです。

YESに変更した場合、minimumFontSizeプロパティで最小フォントサイズを適した設定にする必要があります。



参考文献

UIPickerViewDelegate Protocol Reference

UIPickerView Class Reference

CGGeometry Reference

UIView Class Reference

UIColor Class Reference

UILabel Class Reference

UIFont Class Reference

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

商品詳細を見る






QuietControl 30 wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
10 | 2017/11 | 12
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

QuietControl 30 wireless headphones
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