頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


Google二段階認証でコード受け取り方法を音声通話に変更してみた

ソフトバンクのiPhone4Sが2年契約の終了間際ですでに更新月に入ったのよ。今のところソフトバンクのiPhone4S→simフリーiPhone5sへ変更しようかな、と考えているんだ。
当然今の〜i.softbank.jpってメールアドレスが使えないようになるので他のメールアドレスに今から変更してたのよ。
その一つにGoogleの二段階認証があったんだ。ほら、たまにGoogle関連サイトでログイン時に要求されて、自分の携帯に番号をメールで送ってくるでしょ。メールに書いてる番号を入力すればログインできるっていうあれね。

Googleのアカウントへ行ってメールアドレスを変更しようとしたら、、、
選択可能なメールアドレス
えっ?携帯のキャリアのメールアドレスしか登録できない?
仕方がないからコードの受け取り方法を「テキストメッセージ(SMS)」から「音声通話」というのに変更したのよ。
そうすると、、、iPhoneに電話がかかってきて、日本語で番号を教えてくれるのよ(もちろん人間じゃなくて機械)。で、それを入力すると無事変更完了。ふーん、よくできてるなあと感心したよ。


UIButtonをタップしても反応しない理由

画面上のボタン(UIButtonオブジェクト)をタップしても反応がない、、、たまにあるんだよね。
俺の場合その原因は次の三つのうちのどれか。
(1)ボタンがそれを乗せるビューのframeからはみ出ている場合
(2)ボタンの上にUIViewオブジェクトを乗せている場合
(3)ボタンタップ時のメッセージ送信先をデリゲートにしてる場合(できることもある)

この前もボタンをタップしても反応しない〜、って状況になってさ。ビューの設定がややこしい感じだったので(1)が原因かな、とその辺りをチェックしていたんだけど全然原因が確定しないんだよ。
四苦八苦したあげくわかったのが、ボタンの上に透明なビューを乗せている状態になっていた、というオチでさ。
随分と時間を無駄にしちゃったよ。


(3)の補足
[button addTarget:_delegate action:@selector(tappedButton:) forControlEvents:UIControlEventTouchUpInside];
↑UIButtonの設定時によくこういうコードを書くと思うんだけど、このコードのtargetに直接デリゲートを指定するとメッセージが送信できないことがあったのよ。
MVC的なファイル構成だとVIEWにボタン設置のコードを書いて、タップされば場合にはすぐにCONTROLLERへそのことを伝えるわけじゃない。その場合に直接デリゲートであるCへメッセージを送信したいので上のようにしたんだけどねえ。たぶん俺の理解が浅いので原因が特定できないんだろうけど。

とりあえず、
{
    //ボタンの設定
    [button addTarget:self action:@selector(tappedButton:) forControlEvents:UIControlEventTouchUpInside];
}

-(void)tappedButton:(UIButton *)button
{
    [_delegate tappedButton:button];
}
ってな感じで、targetにselfを指定してそこでデリゲートにメッセージを送ると大丈夫なんだけど、、、なんだか無駄だよねえ。


CALayerはタッチイベントを取得できない

UIResponder Reference


頭と尻尾はくれてやる!/ UIViewのdrawRect:で意外にメモリ使ってた
↑ここでUIViewのサブクラスで描画してたのをCALayer使うわ!で締めてて実際そのように修正してて気が付いたんだけどさ、、、
CALayerってタッチイベントを取得できないんだね!やっちゃったよー!

UIViewならUIResponderクラス(UIViewのスーパークラス)の
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
などで取得できるんだけどね。

二度と時間を無駄にしないように、と情けないながらも記事にしたんだよ。


一番上のイメージ画像を無駄にBlenderで作ってみたんだけど、微妙だったな。


UIViewのdrawRect:で意外にメモリ使ってた

作っているiPadアプリがなぜか落ちちゃう、、、アプリ終了だけではなくてリンゴマークまで出てくる。
もう、しょうがないなあiOS 7は、なんて最初は思っていたけどこういうのはたいてい自分が悪くて、今回もやっぱりそうだったんだよね。ごめんなさい。
そもそもメモリの警告も出てたくらいなので、Instruments使って調べてみたら意外なことにUIViewオブジェクトで妙にメモリを使ってる。
1画面で24MBも使ってるとか。実際にはそれを10枚近く重ねて表示してたものだから、それだけでも、、、ってことなのか?
えー?そうなの?1画面のUIViewオブジェクトで24MBってちょっと多過ぎるんじゃない?と思ってシンプルにして調べてみた。
{
    View4 *view = [[[View4 alloc] initWithFrame:self.view.bounds] autorelease];
    [self.view addSubview:view];
}
↑どうということないコードなんだけど、こんな感じでViewControllerのloadView内でUIViewのサブクラスのオブジェクトを生成してaddSubview:する。
この4って数字は単に内部的なモノなので気にしないでね。

このView4クラス内のdrawRect:内で線で三角形を描いてみる。コードはこんな感じ。
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1];
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(context, 0.3, 0.3, 0.3, 0.5);
    CGContextSetLineWidth(context, 0.5f);
    CGContextMoveToPoint(context, 10, 100);
    CGContextAddLineToPoint(context, 300, 100);
    CGContextAddLineToPoint(context, 160, 400);
    CGContextAddLineToPoint(context, 10, 100);
    CGContextStrokePath(context);
}
スクリーンショット

メモリはどんなもんかな?とInstrumentで見てみると、、、

Instrumentsによるメモリ消費量

え?12MB?結構使うのね、、、
ちなみにこれをiPhone(4inch Retina)だと2.78MBか。
この違いはiPadの画面サイズ?

1024*768 / 320*568 = 4.326…
12/2.78 = 4.316...
なるほど、画面サイズがでかいとその分メモリ使うみたい。

さらにInstrument見ながら「え?」ってなったのが、Viewクラス内の
- (void)drawRect:(CGRect)rect
メソッドなんだけど、このメソッド全てをコメントアウトすれば12MBのメモリ消費が消えるのよ。
- (void)drawRect:(CGRect)rect
{
     //カラ
}
↑このように中身がカラでも12MB使われてる。え?そういうものなの?

Viewクラス内にラベルやボタンを置くだけでdrawRect:を使わないならさほどメモリは消費しないけど、drawRect:メソッドを使う場合は案外(特にiPadだと)メモリを使っちゃうみたい。

で、どうしたかというと、UIViewのサブクラスではなく、CALayerを使うことにしたのよ。
CALayerのサブクラスの
- (void)drawInContext:(CGContextRef)context
メソッド内で描画をすればiPadでも3.00MBになってたよ。これでやってみようっと。


2014年の運勢

2012年は大吉(2012年の運勢
2013年も大吉(2013年の運勢
↑去年のおみくじ、大吉だったのかよ?!って感じなんだけどねえ。

今年はというと、、、

2014年のおみくじ

むう、末吉?小吉とどっちがいいんだ?と思って調べたら、
「大吉・吉・中吉・小吉・末吉・凶・大凶 の順によいともされる」とかなんとか。
吉凶 - Wikipedia

意外に吉っていいのね、とか思ったんだけど我が末吉は小吉より下なんだ。ひとつ賢くなったよ(来年の正月には忘れてると思うけど)。





Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.