[iOS] CATextLayerでiOS6になると、なんか上にパディングがあるみたい

2012/11/21

こんにちは。きんくまです。

いま自作アプリのHabitKeeperのアップデート作業をしているところです。
一気にいろいろと機能を盛り込みたいところなんだけど、
書き出してみたら作業にくじけそうになったので、
細かく分けてバージョンを上げていこうと思ってます。
OCUnitとかGHUnitとかユニットテストをなんとか試しに盛り込みつつやっとります。
これであってるのかわかんないんだけどね、、。

さて、それで、作業をすすめている途中でCATextLayerの挙動にキョドったので、メモです。
CATextLayerでiOS5だとframeの上らへんぎりぎりに文字が描画されるんですが、
iOS6だと微妙なすきまができて、文字が描画されてしまいました。

それで、ググったところ、StackOverFlowさんで書かれてました。
>> ipad – Unwanted Vertical Padding from iOS 6 on CATextLayer – Stack Overflow

t0rstさんが言うにはそうなるフォントとならないフォントがあるみたいです。
Helvetica-Boldはなるから、Helvetica-Nueue使うと大丈夫だよ。とか、
アセンダー、ディセンダーがどうとか書いてあります。
アセンダー、ディセンダーはタイポグラフィの用語ですね。文字の部分的な高さとかを表してます。

>> 2008-08-23 – WEBの細道 ―WEB修行と、仕事と、時々、旅―

なんで、実際のものと見比べてみました。
するとHelvetica-Boldのとき(システムの英語での太字)はキャップハイトからxハイトの差分をとった値が問題の微妙な隙間っぽく見えました。
それでそいつを使ったところ、iOS5とぴったり一致しました。
両方のキャプチャとって重ねたら「完全に一致」ってやつだったので、大丈夫かと思われ。

バージョン判定部分はこのページのyasirmturkさんからいただきました。

    CATextLayer *mytextLayer = [CATextLayer layer];
    CGFloat fontSize = 30;
    UIFont *boldFont = [UIFont boldSystemFontOfSize:fontSize];
    mytextLayer.font = (__bridge CFTypeRef)(boldFont.fontName);
    mytextLayer.fontSize = fontSize;

    CGFloat offsetY = 0;

    //if system version is grater than 6
    if(([[[UIDevice currentDevice] systemVersion] compare:@"6" options:NSNumericSearch] == NSOrderedDescending)){
        offsetY = -(boldFont.capHeight - boldFont.xHeight);
    }

    //you have to set textX, textY, textWidth
    mytextLayer.frame = CGRectMake(textX, textY + offsetY, textWidth, fontSize);

んで、StackOverFlowにも初投稿しておきますた。

LINEで送る
Pocket

[iOS] Grand Central Dispatch(GCD)でメインスレッドを使って途中結果を表示

2012/11/15

2017/05/12追記
この記事はだいぶ古い記事なのですがありがたいことにアクセスが多いです。ですがもし今swift3で書くのであれば以下のページを参考にした方がよいと思います。
非常に簡単に書けるようになっています。

>> Grand Central Dispatch Tutorial for Swift 3: Part 1/2
>> Grand Central Dispatch Tutorial for Swift 3: Part 2/2
>> [Swift 3] Swift 3時代のGCDの基本的な使い方

以下元の記事となります。
====

こんにちは。きんくまです。

今回はスレッドのはなしです。

ふつう時間のかかる処理をそのままやってしまうと、アプリケーションの応答が止まってしまって、
「何これ、壊れてんの?」なんて状態になります。
UIなどの画面の更新はメインスレッドで行われています。
画面が止まってしまっているのは、このメインスレッドが時間のかかる処理で占有されてしまっているため、画面の再描画ができないからです。
なのでそうならないようにするためには、時間のかかる処理をメインスレッドとは違う、別スレッドでやれば良いです。

今回の記事はこの本を参考にしました。

今回作ったサンプルです。

ボタンがおいてあります。
gcd_sample_fig1

そいつを押すと、
1. くるくるとインジケーターが回って、別スレッドで変数のカウントを増やす
2. 途中結果を画面に表示して、また変数のカウントを増やす
3. 最後に結果を表示して、インジケーターを止める
ということをやります。

gcd_sample_fig2

別スレッドとメインスレッドの関係をどうやって設定するのかわからんかったので、ググったところCocoaの日々さんで書かれてました。

>> Cocoaの日々: CoreData – マイグレーションを考慮した CoreDataManager パターン

記事内容は違うんですが、やり方をみていると、Global Dispatch Queueの中でMain Dispatch Queueを呼び出せばよいみたいです。ていうか、本見直したらそういうコードが載ってた。

ちなみに
・Main Dispatch Queue(メインスレッド)
・Global Dispatch Queue(1から自分でスレッドを作らなくても優先度を指定するだけでうまいことやってくれる別スレッド)
です。

話を戻して、さきほどのサンプルの具体的なコードです。

ARC使用, modern Objective-c
KKViewController.h

#import <UIKit/UIKit.h>

@interface KKViewController : UIViewController
{
    IBOutlet UIButton *_startButton;
    IBOutlet UIActivityIndicatorView *_indicatorView;
    IBOutlet UITextView *_logView;
}
- (IBAction)startButtonTapped:(id)sender;
@end

KKViewController.m


#import "KKViewController.h"

@implementation KKViewController

- (IBAction)startButtonTapped:(id)sender
{
    _logView.text = @"Now Proccessing....";
    [_indicatorView startAnimating];
    _startButton.hidden = YES;
    
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    dispatch_async(globalQueue, ^{
        
        //時間のかかる処理
        int count = 0, i;
        for(i = 0; i < 10000; i++){
            NSLog(@"count = %d", count);
            count++;
        }
        
        //メインスレッドで途中結果表示
        dispatch_async(mainQueue, ^{
            [self appendLog:[self logStringWithCount:count]];
        });
        
        //時間のかかる処理
        for(i = 0; i < 10000; i++){
            NSLog(@"count = %d", count);
            count++;
        }
        
        //メインスレッドで終了処理
        dispatch_async(mainQueue, ^{
            [self appendLog:[self logStringWithCount:count]];
            [_indicatorView stopAnimating];
            _startButton.hidden = NO;
        });
    });
}

- (NSString *)logStringWithCount:(int)count
{
    return [NSString stringWithFormat:@"count is %d", count];
}

- (void)appendLog:(NSString *)log
{
    _logView.text = [NSString stringWithFormat:@"%@\n%@", _logView.text, log];
}

@end

こんな感じに、別スレッドの中でメインスレッドをdispatch_asyncで呼び出せばOKみたいです。
時間のかかる処理をする必要があったんで調べてみたんだけど、
GCDを使うと今回みたいなケースでは結構簡単にスレッドが使えて便利ですね。

今回のプロジェクトデータです。

LINEで送る
Pocket

[iOS] 習慣/日課記録アプリのHabitKeeperが発売2週間したので現状報告など

2012/11/6

こんにちは。きんくまです。

習慣/日課記録アプリのHabitKeeperが発売2週間したのでメモを書いておこうと思います。

hk_icon121106

2012/11/06 17:00時点
AppStore 仕事効率化(Productivity)
有料ランキング 165位
トップセールス(Top Grossing) 106位

ちなみに発売開始は2012/10/23でした。

おかげさまでランキングに入りまして、どうもありがとうございました!
んでレビューサイトは見事に1度も載ることなく全スルーされましたw
プロモコードも使われたようなんですが、残念な結果に。
取り上げられるように頑張りたいと思います。

日本と海外

日本と海外のダウンロードの比率は、40% : 60%となってまして、
意外なことに海外の方が多いです。
レビューサイトに載らず、他に情報はアプリのページぐらいなんで、
App Storeだけで決める人もいるのかもしれないです。

最初から海外でもちゃんと使われるようにいろいろと頑張ってたので、
それが良かったのかもしれないです。
例えば日付のところだと、OS側の設定で現地の表示になるようになっております。

日本 > 2012年11月6日(火)
アメリカ > Tue, November 06, 2012
UK > Tue, 06 November 2012

アメリカとUKは月と日付の順番が入れ替わってます。
こういうところは、実装の仕方を調べるのが地味に面倒だったりするのですが、
日々使うものなので気になるところ。日本で「(火)6日11月2012年」とか表示されたら気になります。
なので実装しておきました。

デザインも、アジア系の白地でポップな感じというよりは、欧州とかの地色が入ってスッキリした感じを目指したのも良かったかもしれないです。

売り上げなんですが、海外と全部合わせてiOS Developer Programを払ってさらにランチを食べておつりがくるぐらい。
ここが意外なところでして、ランキングに載ったらもっとすごいのかと思っていたのですが、そうではないようです。
App Storeの売り上げの大半がゲームみたいなんで、最近はこういった専門カテゴリのランキングはそれほど売り上げが必要ないのかもしれないです。

これから

これからは、付け足したい機能がいくつかあるので、それでアップデートしていきたいと思っています。
まずは、データのリセット機能と、バックアップ関連です。
Dropboxや、メール経由のデータのやりとりは、以前に仕事でやったことがあるので、それを実装したいなと。

あとは、アプリのページの情報を増やすことです。
アプリの値段が450円でしてじっくり考えて納得して購入するタイプのものです。
ストアの値段の幅でいうと中間ぐらいですね。
なので、動画をつけたり、機能ごとの説明をもう少し詳しくして、アプリをイメージしやすくしたいなと思ってます。

というわけで、今後ともよろしくお願いします。

LINEで送る
Pocket

[日記] EmacsとかCUIとか

2012/10/28

こんにちは。きんくまです。

最近、Emacsを使う頻度を上げていってます。今回はそれとCUI環境についての感想とかです。

自分がするコンパイル系の言語、Objective-CとAS3はIDEがあるんでEmacsでやりたいと思わないのですが、
スクリプト系のものはこれで全部やりたいなーと試してみてる感じです。

これまでも設定ファイルをいじるときとかに使っていたのだけれど、そうやって単発で使ってただけで
例えば案件で使うということはしてませんでした。

そんで、この間この本を買いまして。

Emacs実践入門 ~思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus) [単行本(ソフトカバー)]

もともとEmacsも基本的な操作自体は知ってはいたものの、ファイルの切り替えや設定の方法はうやむやのままでして、
それが順を追ってわかるようになったのは良かったです。

そんで、1週間ぐらいかけていろいろと環境を整えていってようやくこれならいけるかも!といった感じになりました。

ひとつ本に書いてあったanything.elというものがありまして、これを使おうとしたときに設定がいけないのか上手くいかなかったので、helm.elというものに置き換えてみました。

>> [anything][emacs]anything導入のeverything ~3分で使えるanything.el~

>> emacs-helm/helm · GitHub

使う頻度があがってきて、思ったことがあるのでメモしておきます。

GUI環境で困ってないなら無理してやってみる必要もないが、CUIは試してみる価値はある

デスクトップでGUIのエディタが使えていて困ってないのであれば、無理してやってみることもない気はします。
CUI環境は劇的に作業効率が上がるかというと、そんなにかわるものでもないような気はします。
スーパーはかーのレベルになれば違うのかもしれないんですが、一般人ではそんな感じ。
昔はいざ知らず、EclipseやSublimeとかGUIのエディタは超高機能で、しかも自分で一生懸命機能を追加していかなくても、最初から使える状態になっています。
なんで、CUI環境は全員が無理して使うこともないと思います。

ただ、興味があるならやってみると良いかもしれません。

個人的には、Emacsやシェル(自分の場合はbash)はプラモっていうか自作PCっていうかそんな印象があります。
気に入った機能があったら追加して、だめだったらはずしておく。みたいな。
あと、GUIの方は分野に特化したアプリをいくつも立ち上げる印象があります。OS全体でみると散らかってるみたいな。
それをterminal+emacsとすることで、基本terminal上だけで完結する環境ができるのはスッキリしているなーと。
でもterminal上でもCUIアプリを(ncftpとか)実行したりするので、単なる見かけだけの問題かもしれないです、、。
まあOSでいくつもアプリが立ち上がっているのよりは、terminalに収まっててシンプルで好きかな。これは好みですね。

CUIをうまく使うのには検索を使えるようになるとよい

GUIはまさに目が主役のインターフェースです。
Finderでも様々なアイコンでいろいろな情報を目から直感的に仕入れることができます。
目を起点に何かのアクションを起こす印象があります。

対してCUIは文字が主役。
文字が主役ということは、検索が非常に重要になってきます。GUIの考え方でCUIをやろうとすると目が疲れます。
文字と文字を目視で見比べるよりは、機械で絞り込む方が楽だし確実です。

ファイルの扱いの場合は、含まれている文字列だけでなく、作業更新日や拡張子、容量で絞り込むと見つかりやすくなります。
またエディタの場合も文字列の検索で効率が大分変わってきます。
文字が重要なのでファイル名の付け方も、覚えやすいとか検索にひっかかりやすくとかを意識するようになります。

たぶん、CUIの扱いがもっとうまくなってくれば、目よりもキーワードを覚えておくことが重要になってくるんじゃないかな。
うまく言い表せないのだけど、ブラインドタッチの延長線上のようなそんな印象。
目で見比べるのでなく、キーワードをキーボードに打ち込むことが重要みたいな。

まだまだ自分も始めたばかりなので、terminalのコマンドもうまくいかなくていちいち調べてたりするんですが、
修行を積めば、頭で考えたことを高速で処理できるようなスーパーハカーさんになれるのかもしれません。

LINEで送る
Pocket

[iOS] 日課/習慣を管理・記録するiPhoneアプリHabitKeeperをリリースしました

2012/10/23

こんにちは。きんくまです。

日課/習慣を管理・記録するiPhoneアプリHabitKeeperを本日リリースしました。

habitkeeper_screenshot

どんなアプリ?

コンセプトは「気長に日課を続けること」です。
日課を続けようとしたときに、「やらなきゃいけない」という義務になってしまうとツラくなってしまいます。
なので、「もっと自主的にやりたい」と思うような仕組みはできないかと考えました。
続けることで自分が成長しているのを目で見えるようにすれば、楽しく続けられるのではないかと思い、作成しました。

中二病的に言うと「俺Tueeee」感といいますか。

iOS Simulator Screen shot Oct 12, 2012 10.15.37 PM    iOS Simulator Screen shot Oct 12, 2012 10.16.16 PM

よかったらチェックしてみてください!

appbadge

アプリ余談

自分がわりと3日坊主タイプでして、これまでいろいろと試してはそのたびに飽きてしまったり、挫折してしまったりといったことを繰り返してました。
ただ、英語の勉強は今年で3年目でめずらしく続いてます。
これは、仕事に使うので必要に迫られているのもあるのですが、自分で見つけたコツとしては「ダラダラ続ける」というものでした。
例えば仕事で1ヶ月近くやらなかったとしても気にしない。まるで何事もなく続けるというのが良いみたいです。
歯磨きするのを忘れてしまって寝てしまったとしても、翌日「あーもういいや」という感じになって投げ出すこともなく、何も気にせずまた磨き始めるみたいな。
なので、アプリの方もリマインダーで急かすことなどしてません。思い出したらやれば良いという感じにしました。

あと、ちょっとした記録をつけるというのも意外と効果があることがわかりました。
例えば、今日やったページに日付を入れる。ただそれだけなんですが、同じ1冊を3ヶ月ぐらい続けてるとき、最初の方の日付を見ると「おお、俺頑張ってるじゃんw」みたいに思うことがよくありまして。過去の自分で励まされました。

また、評価の方法も、正解や理想からどのくらいの距離があるかをはかる減点法(%表示)ではなく、とにかく積み上がっていく感じを出そうと加点法を意識しました。
毎日続ける系のものって、なかなか結果が出なかったりして焦ってしまったりします。なんで、「チリもつもれば〜」みたいに一歩一歩進んでいる感じが出ればいいなと思って作りました。

今回は、企画から設計、実装、プロモーションと一通りやったので、満足してます。
いつも(受託)は設計・実装のみ請け負っています。それはそれで良いんですが、自分で1から考えたものを作るのも楽しかったです。
プロモーションは広告を出したわけではなくて、こうやって自分のブログに書いたり、プレスキットを作って各アプリレビューサイトに連絡したりといったことをしました。英語のレビューサイトにも出したので載るといいな。

LINEで送る
Pocket

[iOS] アプリ制作日記 レスポンシブウェブとか

2012/10/18

こんにちは。きんくまです。

前回アプリの審査に出したと書いたのですが、結論から先にいうとまだ見てもらってません!
これはAppleが悪いのではなくて、一度自主的に審査を下ろして、改良してまた審査の列に並び直したからなんです。

というのも、はじめに審査に出してやれやれと思っていて、時間もあったので
ベータテスター(嫁)wに初めて見せたところ、「何をどうするのかさっぱりわからない」と言わてしまいまして。
「うーん、確かにそうかと」くやしいながらも納得。
なので、いったん審査に並び中のところを取り下げました。

そんで初回起動時にヘルプをつけたり、メニューの文言を修正したり、端末からサポートメールを送れるようにして、なるべく初見であまりこういう端末に詳しくない人にもわかりやすくなるように改良しました。
さらに、これまで曜日ごとにチェック日を設定できるのを、○日ごとチェックできる新機能をつけたりしました。
ようやく審査に出したのが先週末という感じです。

なので、来週明けには見てくれるんじゃないかなあと思ってる次第です。

レスポンシブウェブ

アプリのWebページを作ってあったのですが、これをiPhone / iPadから見たところ残念な結果になっていたことに気づきまして。
Appストアからリンクが貼られるのに、端末からちゃんと見られないのはマズイです。

で最近レスポンシブウェブっていうのがあるらしいので、それで対応しました。
今回はデフォルトとiPhone Portrait = 320pxの2つのメディアクエリーのバージョンにしました。
これでPCとiPhone / iPad でも快適に見られるようになりました。

今回はそのあたりのだらだら日記がメインです。

参考にした本

洋書なんですが、本家amazon.comで評判が良かったので買ってみることに。
和書だとこの本がレビューが良いみたいですが、現物は見れてないです。

それで、さっきの洋書は最初の1/3でレスポンシブにする方法を解説していて、残りの2/3でhtml5+CSS3を解説している感じです。
洋書は難しい英語とわりと読みやすい英語とあるんだけど、たぶん文系の人が書いたんだろうなと思うものは難しく感じて(よくわかんない部分がある)、理系の人が書いたものは読みやすく感じます。
この辺、日本語でも文系の方が難しい漢字を使ったりする傾向がある気がするので、そういうものかもしれない。
自分が見ててたぶん文系と思うWebサイトはSmashing Magazine。これはフロントエンド寄りの記事が多くてデザイナー、コーダー向けかも。
たぶん理系と思うWebサイトはRay Wenderlichでこれは完全にiOSのディベロッパー向け。
Smashing Magazineは言い回しとか、出てくる単語が難しい。Ray Wenderlichは、言い回しとか単語が割とわかりやすく感じる。
で、今回の本はフロントエンド系の人が書いているので難しいと思った。理解度は半分くらい。

SASS

話を戻して、今回のページ制作にせっかくなのでSASSを試してみようと思いました。

知らない人は下のところが良記事なのでおすすめです。

>> 【Webデザイナ-・コーダー向け】すぐに使えるSCSS入門|基礎編 | クラスメソッド開発ブログ

すっごく簡単にいうと、変数や関数っぽいもの(mixin)を使えるようになったcssでしょうか。
最終的にscssというファイルをコンパイルしてcssに書き出します。
自分の場合はGUIでなくTerminalのコマンド打つ方が好きなんでそっちでやりました。

CSSは工夫しようとしてもなかなか早く書けない言語だったんで、scssはすごく気に入りました。
レスポンシブウェブだと幅を%でやったりするんで、目的の数値を引数にすれば大丈夫なmixinを書いておけば大分楽です。
あと定数を使ったりするところとか、別ファイルをインポートしておいてコンパイル時にインライン展開するのも何気に便利。

今回はそれにscssのライブラリのBourbonというのを使ってみました。
使ったといってもclearfixのところだけなんですけどね、、。ものは試しってやつで。

なんだかwebもだんだんコンパイル言語みたいになってきてますね。
このまま進んでいくと生のcssがバイナリとか言われたりするんですかね。
コンパイルといえばJavaSdriptでもMSのTypeScrptは試してみたいです。

それで話を戻して、今回最後に残ったのがIEさん対策です。
今回はIE6は対象外にしました。IE7以上だとだいたい同じに見れます。

本によるとModernizrというのがあるらしくてそれを使いました。

>> 様々なブラウザ環境に対応する為のJavaScriptライブラリ「Modernizr」-JavaScript Library Archive
>> Modernizr を使ってブラウザの機能にあわせた CSS, JS を書く | Tips Note

これを使ってもできなかったのはCSS3のセレクタの:nth-child()です。
これは認識してくれなかったので、ベタ打ちに切り替えました。
これで大丈夫になりました。

LINEで送る
Pocket

[iOS] 日課の記録アプリ HabitKeeperのページをアップしました

2012/10/5

こんにちは。きんくまです。

先日審査に出した日課の記録アプリHabitKeeperのページをアップしました。
もし良かったら、ご覧くださいませ。

hk_site_img

>> HabitKeeper – 日課を管理・記録するiPhoneアプリ

審査がうまくいけば、今月中にはリリースできると思います。

LINEで送る
Pocket

ページトップへ戻る