読者です 読者をやめる 読者になる 読者になる

Voice From Space

プログラミングの備忘録とか、趣味の話とか色々。

UIAlertControllerのボタンの太字を制御したいお話【Objective-C】

UIAlertControllerを使って、ダイアログを使う事はままあると思います。

たとえば右にOK、左にキャンセルのボタンを設置したダイアログを作るとする。
ここではiOS9系の前提でまずは話を進めます。

f:id:karmactonics:20160803204113p:plain

この時のコードはこう。

        
        
- (IBAction)showAlert:(id)sender {
    UIAlertController *ac = [UIAlertController alertControllerWithTitle:@"title"
                                                                message:@"ほげ人28号"
                                                         preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK"
                                                 style:UIAlertActionStyleDefault
                                               handler:^(UIAlertAction *action) {}];
    [ac addAction:ok];
    
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"キャンセル"
                                                 style:UIAlertActionStyleCancel
                                               handler:^(UIAlertAction *action) {}];
    
    [ac addAction:cancel];
    
    [self presentViewController:ac
                       animated:YES
                     completion:^{}];
    
}
        
    

 

ここで一つ気になった事がある。
キャンセルボタンのstyleをUIAlertActionStyleCancelにすると、画像のようにキャンセルボタンが太字になる。

ユーザーが好ましくない操作をした時のダイアログならば適しているだろうが、なるべくOKを押してほしい場合には、OKの方を太字にしたいと思うだろう。

では、styleを逆にすれば、太字になってくれるだろうか。

        
UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK"
                                             style:UIAlertActionStyleCancel
                                           handler:^(UIAlertAction *action) {}];
[ac addAction:ok];
    
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"キャンセル"
                                             style:UIAlertActionStyleDefault
                                           handler:^(UIAlertAction *action) {}];
[ac addAction:cancel];
        
    

としてみる。すると、

f:id:karmactonics:20160803213501p:plain

このように、Cancelに設定したボタンは自動的に左に配置されてしまう。

iOSのUIデザインとしては、「左に破壊要素」「右に非破壊要素」という規則に則るのが基本になっているので、あまり好ましくないように思う。iOSヒューマンインターフェースガイドラインにも書かれている。

これに限らず、ガイドラインにはUI設計の上で大切なことがたくさん書かれているので、読んだことのない人は読んでおこう。

iOSヒューマンインターフェイスガイドライン: 一時ビュー

 

では、どうすれば良いか。

実は、iOS9からUIAlertControllerにreferredActionというプロパティが追加されていた。このプロパティに、太字にしたいUIActionを設定すればよいということがわかった。Class Referenceにもしっかりと書いてあった。

UIAlertController Class Reference

        
ac.preferredAction = ok;
        
    

この一文を、太字にしたいUIActionをaddActionした後に書いておく。すると

f:id:karmactonics:20160803215054p:plain

というように、無事右側のボタンを太字にすることができた。

 

ちなみに、このUIAlertActionStyleCancelに指定すると強制的に左に配置されるのは、iOS8.3以降からの現象のようです。

qiita.com

また、iOS8については前述のpreferredActionプロパティが使えませんので、OKボタンを太字にすることはできないと思います。代わりに、両方ともUIAlertActionStyleDefaultに指定することで、両方とも通常の太さにすることであれば可能です。

(もし、iOS8系でも右のUIActionだけを太字にできる方法をご存知の方がいたら、コメント欄などでお知らせいただけると幸いです。

 

以上、備忘録でした。

Fallout4 スナップ写真集

iOSアプリ開発をしようと意気込んではみるものの、

なかなかモチベーションが上がらず、

何かアウトプットをしていこうということで

はてブロで日々学んだことを書いてこうとしたが、

それも中々毎日継続ができていない。

 

それは何故か?

Fallout4のせいである。

 

Fallout4についてはわざわざ全部説明するのも面倒なので

これを見てくれ。見て理解してくれ。

www.youtube.com

 

「もしも核戦争で世界が滅んだら」の世界で、

孤独の主人公が崩壊したボストンを崩壊するシューターRPGである。

 

このゲームが僕の時間を奪っていく。

睡眠や食事より、このゲームをプレイすることの方が魅力的なのである。

 

ちなみに僕はこのトレーラーが大好きである。

こいつのURLを貼ろうと思ってYoutubeのページを開いて、

そのまま3回ほどリピートしてしまった。

 

というわけで(?)、僕が冒険した世界の一部を

ここで紹介していきたいと思う。

もしそれが気に入ったら、買ってプレイしてみてほしい。

気に入らなくても買ってプレイしろや。

 

 

 

f:id:karmactonics:20151229200231j:plain

ゲームを始めて2、30分の主人公の姿である。

ガスマスクと銃、荒廃した景色。素晴らしいコントラストだ。

S.T.A.L.K.E.R.を彷彿とさせる。

 

 

 

 

f:id:karmactonics:20151229200455j:plain

自分好みの拠点を作った後は、とりあえず屋上に椅子を配置した。

果てしなく続くかのような荒野を椅子に座って優雅に眺める。

 

 

 

 

f:id:karmactonics:20151229200652j:plain

戦争が起こってしまう以前は、ここで従業員が笑いながら

肩慣らしのバスケットボールでもしていたのだろう。

今となっては点々と転がるボールと、奇怪な人間もどきが転がっているだけだった。

 

 

 

f:id:karmactonics:20151229201128j:plain

偶然発見した採掘場。

「ダンウィッチ・ボラー」…

嫌な名前だ。

 

 

 

f:id:karmactonics:20151229201307j:plain

寂れたボストンの街並み。

人間のエゴによって破壊された街も、Falloutの世界では美しく見える。

 

 

 

 

f:id:karmactonics:20151229201433j:plain

イケメンである。

 

 

 

 

f:id:karmactonics:20151229201509j:plain

拠点に作ったバー。

ラジオで集った入居者は、労働の1日の終わりにここで身体を休める。

 

 

 

f:id:karmactonics:20151229201626j:plain

戦争の象徴であるパワーアーマーを装着した主人公は、

ボストンの街を見て何に思いを馳せるのか。

 

 

 

 

f:id:karmactonics:20151229201842j:plain

拠点制作の創造性は無限大。

スペクタクル・アイランドにて。

 

 

 

f:id:karmactonics:20151229202127j:plain

どんなに夕日が美しくとも、人は過ちを繰り返す。

War, war never changes.

 

 

 

 

こんな感じでどうでしょうか。

Fallout4面白すぎるんですよ。やめてくださいよほんとに。

さぁ気になったらPS4,XBOX ONE,Steamで絶賛発売中の

Fallout4を買ってプレイするんだ、今すぐ!

 

あ、でも放射能汚染で大きくなったゴキブリとか大きくなった蚊とか

大きくなったトンボとか大きくなったハエとか出てくるから

苦手な人はダメかもね☆

 

 

最近参考にしたiOS開発Tips

qiita.com

⇨for(;;)とfor-inのデメリットも含め参考になりました。

 

EZ-NET: キーボードの位置や大きさを取得する : Objective-C プログラミング

⇨これも非常に助かりました。

いちいちキーボードを開く通知を受け取る設定をさせないといけないのね。

 

www.hirano-dept.com

⇨\nがきたらキーボードを閉じるようにすればいいと。

ぶっちゃけデフォルトで完了ボタンぐらいつけてほしい。

 

 

NSString、NSInteger、NSNumberの変換のやりかた

NSStringとNSInteger、NSNumberの変換、

やるたびググっては「あ、そうだったわ」ってなるので、覚える意味も込めて備忘録。

 

NSString⇆NSInteger

        
//NSString → NSInteger
NSInteger intVal = [@"6278" intValue];

//NSInteger → NSString
NSInteger intVal= 1111;
NSString *st = [[NSString alloc] initWithFormat:@"%ld",(long)intVal];
        
    

NSString⇆NSNumber

        
//NSString → NSNumber
NSInteger intVal = [@"1872" intValue];
NSNumber *num = [NSNumber numberWithInteger:intVal];
    
//NSNumber → NSString
NSNumber *numb = @785;
NSString *numString = [numb stringValue];
        
    

NSInteger⇆NSNumber

        
//NSInteger → NSNumber
NSInteger integerV = 6598;
{
    //1.クラスメソッド
    NSNumber *num1 = [NSNumber numberWithInteger:integerV];
    //2.初期化
    NSNumber *num2 = [[NSNumber alloc] initWithInteger:integerV];
}
    
//NSNumber → NSInteger
NSNumber *num = @56432;
NSInteger integer = [num integerValue];
        
    

 

はてブロ書く上で、HTMLの書き方も思い出しといたほうがいいなぁ…

UITableViewを更新しようとreloadData走らせると表示されてるセルが更新されなかった話

  1. データ通信を非同期で行う
  2. tableViewのセル内はデータ未表示で画面表示
  3. 通信が終わってデータが正常に取得できたらテーブルをリロードして表示する


って処理をやりたいんだけど、データ取得後のリロードがうまくいかない。

正確にはリロードした時、表示されているセルのデータが表示されない。

んでスクロールなりして元のセルに戻ってくると今度は表示された。

データは正常に受信できてる。

 

これの原因が全くわからなくてかなり悩んだ。

 

 

  • TableViewのreloadDataメソッドは、テーブル全体が更新されるんじゃないのか?
  • セクションの高さが0だとcellForRowAtIndexPathが呼ばれないらしい?でも0にはしていない。
  • ただ調べるとreloadData走らせてもcellForRowAtIndexPathが呼ばれてない。
  • 特定の条件でreloadDataが上手く走らないなんてあるのか?リロードするタイミングの問題なのか?

 

 

とか色々考えて、行き着いた先がコレ

blog.livedoor.jp

 

どうやら、セルの再利用に起因するものらしい。

 

この現象の原因は、先ほど述べた「セルの再利用」に起因します。
タイプ2のセルを表示するため再利用するセルは、直前に使用されたセル情報を元に作られます。
その元情報がタイプ1だった場合、タイプ2では再利用された詳細文字列がそのまま使用される事になります。

ほう、と。

いや、よくわからんが、事象が似ている。

一回作って再利用すると、元情報のものが使われるってことかな。

再利用時は制約がかかる領域ができる…みたいなぼんやりした認識。

 

とりあえず、データ受信したらtableViewを再構成したら、

無事表示できるようになった。

 

セルの再利用について、なんとなーくしか頭に入れてなかったけど、ちゃんと知っとこうと思った次第。

UITableViewCellにaddSubviewしたUIButtonがタップしても反応してくれなかった

原因は単純だったしたいした事じゃなかったんですけどとりあえずなんでも気づいたらoutputしようと思ったのでメモ。

 

カスタムセルの右端にボタンを設置して、ボタンをタップすると別画面に遷移する。ボタンは画像をセットする。
 
        
CustomCell.m

@property (nonatomic) UIButton *button

~略~

- (void) hoge{

    self.button.frame = CGRectMake(CGRectGetWidth(self.contentView.frame) - 20,
                                                   10 //適当
                                                   15,
                                                   15);

    UIImageView *buttonImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"hoge.png"]] ;
    buttonImage.frame = CGRectMake(0,0,15,15);
      
    [UIButton addSubview:buttonImage];

    [self.contentView addSubview:button]

}
        
    

 

適当だけど上記みたいに。

だけどいくらタップしても反応せず。
 
結論から言うと、ボタンが小さく、反応がすこぶる悪くなっていただけでした。
 UIButtonのsizeを25*25にしてボタンの範囲を広くすると、反応するようになりました。
 

- (void) hoge{

        self.button.frame = CGRectMake(CGRectGetWidth(self.contentView.frame) - 20,

                                                               10 //適当

                                                               25, //ボタン範囲を広げた

                                                               25    //ボタン範囲を広げた

                                                              );

      UIImageView *buttonImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"foo.png"]] ;

      buttonImage.frame = CGRectMake(0,0,15,15);

     [UIButton addSubview:buttonImage];

    [self.contentView addSubview:button]

}

まあ単純に反応できるように大きくしろよって話だったんですけど、
画像はそのぐらいの大きさで表示させたかったので。
 
他のViewに重なってボタンが押せないとか、そういうのでなければ、
単純にタップできてない、って可能性を考える頭がなかった。
 
  • ButtonをbringSubviewToFrontしたりとか、
  • [self.contentView setUserInteractionEnabled: NO]したりとか、
  • 親ビューからボタンがはみ出してないかとか、
色々やってダメだったら領域に問題があるってのも考える。
 
…そもそもUIButtonにsetImageでなくimageViewをaddSubviewするのが
いいやり方なのかどうかがわかってないですが。
 

ふとしたキッカケから人間椅子というバンドを聴いてみたらめちゃくちゃハマったから紹介したくなった

最近彼女と同棲を始めましたKarmactonicsです。

カルマとプレート・テクトニクスでKarmactonicsです。

はてなブログ記事です、よろしくお願いします。

 

中学校の頃に出会ったBUMP OF CHICKEN

高校の頃に知ったtacica

大学入って傾倒したamazarashiのように、

社会人になってまたいい音楽に巡り会えたなということで

書いてみようかなと思った次第です。

 

キッカケはニンジャスレイヤー フロムアニメイション

 

今年の4月からニコニコ動画で配信を開始した、

「ニンジャスレイヤー フロムアニメイション」。

 

ニンジャスレイヤーという作品は以前から知っていたんですが、

原作が小説ということで、普段読書というものを全くしない僕にとっては

中々手を出す意欲が沸かんかったんです。

 

アニメ化はそんな僕には有難い事だった。

1話開始当初はプチ炎上みたいな感じにもなりましたが!

終わってみればいやはや良い作品だな、という感想しか出てきません。

DVDも今のところ全巻買っとるし。

 

このアニメ、EDに毎回違うアーティストの楽曲を起用するって試みをしてます。

ですがその人選がまた…

「絶対この手のアーティスト好きな奴がスタッフにおるやろw」

って思っちゃうくらいコアなアーティストを起用するというか…

この人達持ってくるかー!!っていうワクワクがあって、

ヘッズの皆さんもそれを楽しみにしていた。

 

そして回を重ね第20話。

EDに流れたのは人間椅子の「泥の雨」。

 

 

第一印象は「ずいぶん特徴的な声してんなー」でした。

なんか歌い方が独特で、勝手に「若くて彫りの深くて幸の薄そうなボーカル」像を浮かべていました。

 

まあ今の時代気になったらすぐYouTubeで適当な動画を探しますよね。

そんで見つけたんがコレ。

 

 

全然若くないやんけ!なんやこのおじいちゃん!

 

いやだがしかし曲がめちゃくちゃカッコいい。

ボーカルの文豪という言葉が似合う出で立ちとハリのある声。

邪悪なメタルギターサウンド。

暗黒僧侶のうねるようなエグいベースライン。

力強く攻め立てるようなヤクザの兄ちゃんのドラムサウンド。

 

なんやこれ…クソかっこええやんけ。

 

この曲が僕のロックハートにグサッと刺さりまして、

速攻仕事帰りにベストアルバム「現世は夢」と、

フルアルバム「黄金の夜明け」「頽廃芸術展」「三悪道中膝栗毛」を買った次第です。

 

 

いろいろ調べたら、まず活動歴25年!

メンバー全員が50歳近いという長寿バンド。

キング・クリムゾンブラック・サバスメタリカ等のメタルバンドをこよなく愛する生粋のメタラー

 

うーん、濃いなー。キャラが。

 

 

それにしても、宇宙からの色の吐き気を催すような詞がいいなぁ…。

 

…ん?

吐き気を催すような…?

「宇宙からの色」…?

 

宇宙からの色 - Wikipedia

 

クトゥルフやんけ!!

(宇宙からの色はクトゥルフ神話体系とは違う話やけども)

 

僕が人間椅子にハマったのは

クトゥルフ神話の作品を題材とした曲」が多数あるからというのがあります。

クトゥルフ神話:作家H・P・ラヴクラフトの書いたホラー小説を元に作られた神話体系

 

先に紹介した「宇宙からの色」もそうですし、

Amazon.co.jp: 人間椅子 : 黄金の夜明け - 音楽

アルバム「黄金の夜明け」には「水没都市」「狂気山脈」といった曲があります。

狂気の山脈にて - Wikipedia

ルルイエ - Wikipedia

 

Amazon.co.jp: 人間椅子 : 頽廃芸術展 - 音楽

頽廃芸術展」には「ダンウィッチの怪」があります。ド直球ですね。

ダンウィッチの怪 - Wikipedia

 

なにせクトゥルフ神話を題材に曲を書いているバンドは

あまり出会ったことが無いもので、これクトゥルフや!と

わかった時には嬉しいやらワクワクやらで。

 

 

 

 

というか、ここまで長く活動してて、なんで知らなかったっていう。

本人達の話をちょいちょい聞く、となかなか売れない時が長く続いたみたいですね。

spice.eplus.jp

>「あの売れなかった時代を経て、今ここにいるよ」とか、味わいながらやりましたね。

 

ここ最近はずっと人間椅子を通勤中などに聴いてます。

人間椅子を知っている人から見たら今更感のあるエントリーかとは思うんですが、

どんなバンドか調べてる時の衝撃を少しでも伝えたくて。

 

これから少しずつアルバムを買って、

最終的にはコンプリートしたいな、とも思ってたりします。

 

なまはげ」で曲を作る斬新さと、オドロオドロしいなまはげの恐怖感。

3:00からのメタル魂に心打たれる。

 

 

MetallicaBudgieのBreadfanのカバー。

ライブのラストに相応しい盛り上がり。