iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
『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プロパティの値がアニメーションすることになる。
前回に引き続いて、新宿三丁目で開催。
チーム開発というタイトルでiOプロビジョニングポータルやredmineについてと、USキーボード利用者を想定して英数/ナカかなキーボードの紹介、アンドゥ/リドゥ管理、performSelectorを使った遅延実行などについての発表があった。
『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(これまたスペル間違い)を選択すると、元に戻る。
音楽関連アプリケーションも興味がある分野だ。アプリケーション開発の為に調べたことを記事にしてみた。
音階の周波数と比を調べてみた。
C | C# | D | D# | E | F | F# | G | G# | A | A# | B | C | C# | D | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
周波数 | 261.6300 | 277.19 | 293.66 | 311.13 | 329.63 | 349.23 | 370.00 | 392.00 | 415.31 | 440.00 | 466.17 | 493.88 | 523.26 | 554.37 | 587.34 |
比 | 1.000 | 1.059 | 1.122 | 1.189 | 1.260 | 1.335 | 1.414 | 1.498 | 1.587 | 1.682 | 1.782 | 1.888 | 2.000 | ||
純正律 | 4対 | 5対 | 6対 | ||||||||||||
純正律 | 4対 | 5対 | 6対 | ||||||||||||
純正律 | 4対 | 5対 | 6対 |
周波数と比は平均律の値で、平均率とは1オクターブを均等に12個に分けた音階だ。そして、純正律は「ドミソ」「ソシレ」「ファラド」が4:5:6の比になるようにチューニングした音階だ。
平均律の場合は、純正律と比較すると、整数比になっていなのだが、まあ、近いと考えて、純正律で整数と成っている音階に印をつけると、印がついていない音階は#がついている。
ドレミファは何故12個でない。音と音の距離が全音だったら半音だったり何故?と思っていたのだが、なるほど、響きあう音をドレミにしたということか。