2012/09/10

Layerで(お手軽に)どこまで出来るか?

「神は細部に宿る」らしい。

だもんで、ここ最近はなるべく細部の動きと見た目に気をつけてアプリを開発している(つもりだ)。
で、細部を詰めて見た目を良くしようと思うと、ドカドカと画像を貼込む事になって、気がつけば画像リソースのサイズがエライ事になっている。
なんてことがちょっと有ったり無かったりした。

画像ファイルの場合、小さなものでもキロバイト単位のファイルになる。
これが種類を増してくると、チリも積もればナントやらで、あっという間にメガ単位。
そりゃ、アプリのサイズが大きくなる程度なら、ユーザ様にダウンロード時に我慢していただくだけですむ(か?)のだが、
そのリソースはほぼ確実にUI上に貼込まれる訳で、イコール、貴重な実行時のリソースを単なる画像が喰い潰すという現象が発生する。

という訳で、なるべく画像を使わずに、見た目を良くする方法を模索してみた。
具体的には、CALayerを利用して出来る範囲を模索する。
※ キアイを入れればCALayerで、もっともっとイロイロ出来るらしいが、お手軽に画像を置き換える手段として、コピペでなんとかなるレベルで! というのが、コンセプト。

まずは、出力結果から

この出力得るためのコードが下記、
※view(n)は、上からの順番になっている。


- (void)viewDidLoad
{
    [super viewDidLoad];
 // Do any additional setup after loading the view, typically from a nib.
 
 // view1 
 // nothing to do.
 
 // view2
 // 角丸め
 view2.layer.cornerRadius = 15.0f; // 角Rサイズ
 view2.clipsToBounds = YES;
 
 // view3
 // 縁取り
 view3.layer.borderWidth = 4.0f;
 view3.layer.borderColor = [UIColor orangeColor].CGColor;
 
 // view4
 // 影付け(外)
 view4.layer.shadowColor = [UIColor grayColor].CGColor;
 view4.layer.shadowOpacity = 0.8f; // 影透明度
 view4.layer.shadowRadius = 4.0f; // ぼかし範囲
 view4.layer.shadowOffset = CGSizeMake(4.0f, 4.0f);
 
 // view5
 // 影付け(内)
 // 影の投影はsubLayerへ
 CALayer* subLayer = [CALayer layer];
 subLayer.frame = view5.bounds;
 subLayer.masksToBounds = YES;
 subLayer.shadowColor = [UIColor darkGrayColor].CGColor;
 subLayer.shadowOpacity = 1.0f; // 影透明度
 subLayer.shadowRadius = 4.0f; // ぼかし範囲
 subLayer.shadowOffset = CGSizeMake(4.0f, 4.0f);
 // 影生成用のパス構築
 CGMutablePathRef pathRef = CGPathCreateMutable();
 CGPathMoveToPoint(  pathRef, nil, -5, -5);
 CGPathAddLineToPoint( pathRef, nil, -5, view5.bounds.size.height);
 CGPathAddLineToPoint( pathRef, nil, 0, view5.bounds.size.height);
 CGPathAddLineToPoint( pathRef, nil, 0, 0);
 CGPathAddLineToPoint( pathRef, nil, view5.bounds.size.width, 0);
 CGPathAddLineToPoint( pathRef, nil, view5.bounds.size.width, -5);
 CGPathCloseSubpath(pathRef);
 subLayer.shadowPath = pathRef;
 [view5.layer addSublayer:subLayer];
 
 
 // view6
 // グラデーション
 CAGradientLayer* gradetionLayer = [CAGradientLayer layer];
 gradetionLayer.frame = view6.bounds;
 gradetionLayer.locations = [NSArray arrayWithObjects:
        [NSNumber numberWithFloat:0.0f],
        [NSNumber numberWithFloat:0.5f],
        [NSNumber numberWithFloat:1.0f],
        nil];
 
 gradetionLayer.colors = [NSArray arrayWithObjects:
        (id)[UIColor orangeColor].CGColor,
        (id)[UIColor yellowColor].CGColor,
        (id)[UIColor greenColor].CGColor,
        nil];
 [view6.layer addSublayer:gradetionLayer];
        
 
 
 // view7
 // 角丸+枠+グラデーション
 {
  CAGradientLayer* gradetionLayer = [CAGradientLayer layer];
  gradetionLayer.frame = view6.bounds;
  gradetionLayer.locations = [NSArray arrayWithObjects:
         [NSNumber numberWithFloat:0.0f],
         [NSNumber numberWithFloat:1.0f],
         nil];
  
  gradetionLayer.colors = [NSArray arrayWithObjects:
         (id)[UIColor colorWithRed:0.75f green:0.75f blue:0.75f alpha:0.4].CGColor,
         (id)[UIColor colorWithWhite:1.0f alpha:0.3].CGColor,
         nil];
  [view7.layer insertSublayer:gradetionLayer atIndex:[view7.layer.sublayers count]-1];
  
  view7.layer.borderColor = [UIColor grayColor].CGColor;
  view7.layer.borderWidth = 0.5f;
  
  view7.layer.cornerRadius = 15.0f; // 角Rサイズ
  view7.clipsToBounds = YES;
 } 
 
 // view8
 // 丸ボタン(作例)
 {
  view8.layer.shadowColor = [UIColor darkGrayColor].CGColor;
  view8.layer.shadowOpacity = 0.8f; // 影透明度
  view8.layer.shadowRadius = 4.0f; // ぼかし範囲
  view8.layer.shadowOffset = CGSizeMake(4.0f, 4.0f);
  
  view8.layer.borderColor = [UIColor blueColor].CGColor;
  view8.layer.borderWidth = 4.0f;
  
  view8.layer.cornerRadius = 20.0f; // 角Rサイズ
//  view8.clipsToBounds = YES; // <- これが有効だと影が表示されない。
 } 
}

うん、ざっとこんな感じ。

2012/08/22

トラックボール故障ス。そして…

告白しよう、私はトラックボール愛好者だ。
マウスなどという設置箇所が固定されないポインティングデバイスは、未完成品である。
と、ワリと本気で思っているほどの中毒者と言ってもいいだろう。

で、愛用しているのは、本業環境では「Kensington SlimBlade Trackball」俗にSBTと呼ばれている。
自宅環境では「Kensington ExpertMouse 7」、俗にEM7と呼ばれている機体が、2正面作戦を展開している。
(もっとも、家での作業環境が深夜〜早朝のリビングに移っている昨今、EM7の出番は多くはない)


そんな中、世の中が盆休みを謳歌している最中に、本業で使用中だったSBTが縦方向の動きが急に渋くなり、間もなく横方向にしかカーソルが移動しなくなった。
ボタン類は正常に動作するが、スクロールが機能しなくなり、ポインティングデバイスとしての役割を果たさなくなってしまった。

SBTはカーソルの移動量の検出にあまり一般的ではない方法を使っている。
まず、SBTには2つの光学センサーが内蔵されている。1つは横方向検出用、それと設置平面上で直行する形で、2つ目の縦方向検出用があるのだ。
通常の光学マウスでは、センサーは1つであり、それで十分縦横の移動量を検出できる。
この一見オーバースペックというか、光学系の無駄遣いともいえるセンサーの設置は、トラックボールの肝ともいえるボールを「捻る」事により、スクロールを実現するために使用される。
光学センサーは1つで2軸(縦方向と横方向)の移動量を検出できるが、
SBTは直交に配置した2つの光学センサーの1軸づつをカーソルの移動量検出に使用し、余ったもう一軸を捻りスクロールの検出に使っている。
このため、1つの光学センサーが動作不良を起こすと、担当する軸のカーソル移動と同時に、スクロールの動作も行えなくなる。

そして今回は、縦方向の移動量検出用光学センサーが不調を来したため、縦方向へのカーソル移動および、スクロールが出来なくなっていたのだ。

発売直後に購入して2年強、連日のコロコロがたたってついに寿命か。
そう思い、一度は自前での分解修理を決意しかけた。

だが、ふと視界に入ったSBTの空き箱に「5年間保証」の文字を見つけた。

という訳で購入先ではなく、輸入代理店の七陽商事のサポートに連絡を取った。
サポートに専用フォームから連絡したのが、世の中はお盆の最終日(8/15)当然その日は音沙汰無し。
翌日午前中、サポートより連絡がきた。(対応ハヤッ)
同日午後一で宅急便にて故障したSBTを発送。
週明けの8/20、新品に交換されてSBTが手元に戻って来た。

いやはや、どこかの大手メーカーのサポートとは大違いのスピーディーな対応。
ビバ! 七陽商事。である。

当然ながら、新品のSBTは先代と変わらないスムーズな動作でカーソルを縦横に移動させ。画面をスクロールさせている。


2012/08/11

「Font Sampler」始めました。

夏のミニアプリ第2弾、「Font Sampler」が
App Storeよりダウンロード可能になりました。



Font Samplerは iPhoneアプリ開発者、デザイナー、もちろん一般のユーザー様が
iOSデバイスで表示可能なフォントをじっくり確認するためのアプリです。

フォントサイズは1pt〜100ptまで調整可能。
特定の文字列を入力して見栄えを確認しながらサイズを調整していただけます。
また、表示中の文字列の表示に必要なサイズもリアルタイムに表示されますので、
画面レイアウトの情報として利用可能です。

どうぞ、ご利用ください。