トップ 最新 追記

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|

2013-03-20 [OSX][iOS]背景フィルタ

『Core Animation for Max OS X and the iPhone』の『6.2 Background Filters』について説明する。

背景フィルタは、自身の配下に下位ビューが存在しているビューに対して、フェルタ効果を適用する為の機能だ。そして、当然だが、背景となるビューを下位ビューが不透明で覆い被さっている場合は、意味をなさないものとなる。

サンプルコードのフィルタの定義は以下のとおり。

- (void)applyFilter { 
  CIVector *center = [CIVector 
                      vectorWithX:NSMidX([self bounds]) 
                      Y:NSMidY([self bounds])];
  CIFilter *torus = [CIFilter filterWithName:@"CITorusLensDistortion" 
                               keysAndValues:kCIInputCenterKey, center, 
                     kCIInputRadiusKey, [NSNumber numberWithFloat:150.0f], 
                     kCIInputWidthKey, [NSNumber numberWithFloat:2.0f], 
                     kCIInputRefractionKey, [NSNumber numberWithFloat:1.7f], 
                     nil];
  torus.name = @"torus"; 
  
  [controls setBackgroundFilters:[NSArray arrayWithObjects:torus, nil]];
  [self addAnimationToTorusFilter];
}

controllsは背景となりビューのことだ。CITorusLensDistortionフィルタの名前を"torus"と設定しているので、これがキーとなる。

アニメーションの定義は以下のとおり。

- (void)addAnimationToTorusFilter { 
  NSString *keyPath = [NSString stringWithFormat:
                       @"backgroundFilters.torus.%@",
                       kCIInputWidthKey];
  CABasicAnimation *animation = [CABasicAnimation 
                                 animationWithKeyPath:keyPath];
  animation.fromValue = [NSNumber numberWithFloat:50.0f];
  animation.toValue = [NSNumber numberWithFloat:80.0f];
  animation.duration = 1.0;
  animation.repeatCount = 1e100f;
  animation.timingFunction = [CAMediaTimingFunction functionWithName:
                              kCAMediaTimingFunctionEaseInEaseOut];
  animation.autoreverses = YES;
  [[controls layer] addAnimation:animation forKey:@"torusAnimation"];
}

ビューのbackgroundFiltersプロパティに"torus"という名前でフィルタを登録したので、キーパスは"backgroundFilters.torus"となる。そして、操作するキーパスは"backgroundFilters.torus.kCIInputWidthKey"ということなので、フィルタのkCIInputWidthKeyプロパティの値がアニメーションすることになる。

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

2013-03-23 関東第58回Cocoa勉強会

前回に引き続いて、新宿三丁目で開催。

チーム開発というタイトルでiOプロビジョニングポータルやredmineについてと、USキーボード利用者を想定して英数/ナカかなキーボードの紹介、アンドゥ/リドゥ管理、performSelectorを使った遅延実行などについての発表があった。

Cocoa勉強会

_ 関連情報

Cocoa勉強会

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

2013-03-24 [OSX][iOS]内容フィルタ

『Core Animation for Max OS X and the iPhone』の『6.3 Content Filters』について説明する。

サンプルコードのFilteredViewは、IBActionのスペルが間違っていて、そのままでは動かない。なので、スペル間違いを我慢して、FilteredView.mのメソッド名を変更するか、FilteredView.hのIBActionを正しいスペルに変更し、MainMenu.nibのFilteredView.mの繋がりを張り直す必要がある。ちなみに、著者は後者を選択した。

内容フィルタとは、フィルタを適用したビューの下位ビューに適用されるフィルタのことのようだ。

フィルタの定義は以下のとおり。

- (void)pointillize
{ 
  CIVector *center = [CIVector vectorWithX:NSMidX([self bounds]) 
                                         Y:NSMidY([self bounds])];
  CIFilter *pointillize = [CIFilter 
                          filterWithName:@"CIPointillize" 
                          keysAndValues:kCIInputRadiusKey, 
                          [NSNumber numberWithFloat:1.0f],
                          kCIInputCenterKey, center, nil];
  pointillize.name = @"pointillize";
  [controls setContentFilters:[NSArray arrayWithObjects:pointillize, nil]];
}

CIPointillizeフィルターは、点描スタイルでレンダリングするフィルタだ。

フィルタを実行するIBActionの記述は以下のとおり。


- (IBAction)noPointillize:(id)sender
{
  if (0 < [[controls contentFilters] count]) {
    [controls setContentFilters:nil];
  }
}
 
- (IBAction)heavyPointillize:(id)sender
{ 
  if (nil == [controls contentFilters]
    || 0 == [[controls contentFilters] count]) {
    [self pointillize];
  }
  NSString *path = [NSString stringWithFormat:
                    @"contentFilters.pointillize.%@", kCIInputRadiusKey];
  [controls setValue:[NSNumber numberWithInt:5.0f] forKeyPath:path];
}
 
- (IBAction)lightPointillize:(id)sender
{ 
  if (nil == [controls contentFilters]
    || 0 == [[controls contentFilters] count]) {
    [self pointillize];
  }
  NSString *path = [NSString stringWithFormat:
                    @"contentFilters.pointillize.%@", kCIInputRadiusKey];
  [controls setValue:[NSNumber numberWithInt:1.0f] 
          forKeyPath:path];
}

Heavy Pointalize(スペル間違い!)ボタンを押下すると、コントロール類が荒い点描に、Light Pointalize(これもスペル間違い!)ボタンを押下すると、コントロール類が細かい点描に。ポップアップするメニューでNo Pointalize(これまたスペル間違い)を選択すると、元に戻る。

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

2013-03-31 [OSX][iOS]音階

音楽関連アプリケーションも興味がある分野だ。アプリケーション開発の為に調べたことを記事にしてみた。

音階の周波数と比を調べてみた。

CC#DD#EFF#GG#AA#BCC#D
周波数261.6300277.19293.66311.13329.63349.23370.00392.00415.31440.00466.17493.88523.26554.37587.34
1.0001.0591.1221.1891.2601.3351.4141.4981.5871.6821.7821.8882.000
純正律4対5対6対
純正律4対5対6対
純正律4対5対6対

周波数と比は平均律の値で、平均率とは1オクターブを均等に12個に分けた音階だ。そして、純正律は「ドミソ」「ソシレ」「ファラド」が4:5:6の比になるようにチューニングした音階だ。

平均律の場合は、純正律と比較すると、整数比になっていなのだが、まあ、近いと考えて、純正律で整数と成っている音階に印をつけると、印がついていない音階は#がついている。

ドレミファは何故12個でない。音と音の距離が全音だったら半音だったり何故?と思っていたのだが、なるほど、響きあう音をドレミにしたということか。

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

トップ 最新 追記