UIBarButtonItemのUIButtonでカスタムしたボタンをhighlited時に光るようにする


ツールバー上に設置したUIBarButtonItemの標準のボタンはタップするとピカーと光るようなハイライト表示になる。

UIBarButtonItemにUIButtonでカスタムしたボタンを使っているときに同じように光るようにするには下記のようにすればいいと最初に思いつく。

UIButton* customButton = [UIButton buttonWithType:UIButtonTypeCustom];
[customButton addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
[customButton setBackgroundImage:[UIImage imageNamed:@"custom_button_image"] forState:UIControlStateNormal];
[customButton setImage:[UIImage imageNamed:@"highlited_button_image"] forState:UIControlStateHighlighted];
 UIBarButtonItem* customItem = [[UIBarButtonItem alloc] initWithCustomView:customButton];

上記のhighlited_button_image がピカー光るような感じに作った画像で、ボタン形状のcustom_button_imageを背景画像にしておいて、これを setImage でUIControlStateHighlightedのときに光る画像で上書きする。

これでよいはず……しかしこれがうまく行かない。

結論:
customButton.showsTouchWhenHighlighted = YES; というのがいるようです。
また、UIControlStateHighlighted だけだとTouch Upした時にこのハイライトがずれた位置に表示されることがあった。
これは UIControlStateSelected | UIControlStateHighlighted にすることで解消した。

よって下記のようになった。

UIButton* customButton = [UIButton buttonWithType:UIButtonTypeCustom];
[customButton addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
[customButton setBackgroundImage:[UIImage imageNamed:@"custom_button_image"] forState:UIControlStateNormal];
[customButton setImage:[UIImage imageNamed:@"highlited_image"] forState:(UIControlStateSelected | UIControlStateHighlighted)];
customButton.showsTouchWhenHighlighted = YES;
 UIBarButtonItem* customItem = [[UIBarButtonItem alloc] initWithCustomView:customButton];

参考にしたのは:ios – Turn off highlighting on UIBarButtonItem – Stack Overflow

UIImageの90度回転


drawRectの中でUIImageを単純に90度回転したかったのだけれど、なんだかいろんな方法がWebには上がっていて実際試してみたりして丸一日遠回りしてしまった。
例えば、
UIImage-Extensions (これ自体はとても便利そう)
How to Rotate a UIImage 90 degrees?
rotate a UIImage help
また、contextには他にもいろいろ描画するのでcontext全体を回転させたくはないというのもある。

それで結論的にはUIImageの90度の回転だけなので、とても簡単にできたのでメモしておく。UIimage.CGImage を使う。
ここに記事がある→Rotate a UIImage by 90 degree angles

 image = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationRight];