NSLog ログ出力しよう 文字列(NSString)編

 

文字列のログを出力する方法です。文字を出力するときには、

%@

というのを使います。文字列の定義が @”” なので、これを使うと、@”%@”となるため、@が2個並んでいてなかなか不思議な感じですね。

文字列をログ出力するサンプルで確認してみます。

    NSString *str = @”あいうえお。;

    NSLog(@”%@”, str);

これを実行すると、Xcode のコンソールに、あいうえお。 と出力されます。

他の文字の間に混ぜることも可能です。

    NSLog(@”はじめ 「%@」 おわり, str);


として実行すると、コンソールには、はじめ 「あいうえお。」 おわり と出力されます。

正規表現 NSRegularExpression はさまれた文字を括弧で取得する "AB(.*)E"

iOS の正規表現の使い方メモです。
(iOS 5で試しています)
今回は 特定の文字列に挟まれたところを取得する方法を見ていきたいと思います。(capture groups)
iOS の正規表現では、次の二つのクラスがキーになります。
 NSRegularExpression : パターンを指定
 NSTextCheckingResult : ヒットしたRange の配列を保持
パターン指定の際に、抜き取りたいところを括弧() で括ると、それをキャプチャした結果が、NSTextCheckingResult の配列に追加されてきます。配列には、0 番目にパターンがマッチした文字列全体のRange、以降に括弧でキャプチャした文字列のRange と続いていきます。
では、試しに。
文字列 「かえるぴょこぴょこみぴょこぴょこあわせてぴょこぴょこみぴょこぴょこ」という文字列のなかから、「ぴょこぴょこ」に挟まれた文字を抜き出すサンプル実装を書いてみます。

@implementation ViewController

– (void)viewDidLoad

{

    [superviewDidLoad];

    NSString *frogSong = @”かえるぴょこぴょこみぴょこぴょこあわせてぴょこぴょこみぴょこぴょこ;

    NSRegularExpression *reg = [[NSRegularExpressionalloc] initWithPattern:@”(.*)ぴょこぴょこ(.*)ぴょこぴょこ(.*)ぴょこぴょこ(.*)ぴょこぴょこ options:0 error:nil];

    NSArray *matches = [reg matchesInString:frogSong options:0 range:NSMakeRange(0, [frogSong length])];

    for (NSTextCheckingResult *result in matches) {

        NSLog(@”結果リスト数: %d”, [result numberOfRanges]);

        for (int i = 0; i < [result numberOfRanges]; i++) {

            NSRange r = [result rangeAtIndex:i];

            // 0番目は全体、以降、パターンで指定した括弧に該当する文字列

            NSLog(@”検索結果 %@”, [frogSong substringWithRange:r]);

        }

    }

}

これを実行するとこんな感じのログが出てきます。

結果リスト数: 5

NSTextCheckingResultの中身 かえるぴょこぴょこみぴょこぴょこあわせてぴょこぴょこみぴょこぴょこ

NSTextCheckingResultの中身 かえる

NSTextCheckingResultの中身

NSTextCheckingResultの中身 あわせて

NSTextCheckingResultの中身

UIButton 背景色を変える

UIButton の背景色を変える方法

(iOS 5 で試してます。)
1. UIButtonTypeCustom
2. backgroundColor
この二つがポイントです。 ButtonType も重要です。私の場合、最初は RoundRect で試してみたのですが、ボタンの色が、
黒くしたいのは、そこじゃない。。という感じになってしまいました。どうやら、ボタンに色をつけるには、UIButtonTypeCustom の方が制御しやすいようです。UIButtonTypeCustom で backgroundColor を指定すると、こんな感じになります。
UIButton *customBtn = [UIButton buttonWithType:UIButtonTypeCustom];
customBtn.backgroundColor = [UIColor blackColor];
以下、サンプルコードです。

@implementation ViewController

– (void)viewDidLoad

{

    [superviewDidLoad];

    UIButton *customBtn = [UIButtonbuttonWithType:UIButtonTypeCustom];

    customBtn.frame = CGRectMake(0, 0, 200, 50);

    customBtn.center = CGPointMake(self.view.center.x, 200);

    [customBtn setTitle:@”Black Color”forState:UIControlStateNormal];

    customBtn.backgroundColor = [UIColorblackColor];

    [self.view addSubview:customBtn];

}

UIButton setTitle よく忘れる。。

UIButton をコードで実装するときに、

「ボタンに文字を表示するにはどうするか?」

これを結構わすれてしまいます。忘れないようにメモ。

( iOS 5で試してます。)

btn.titleLabel.text = @”押してね;     // でない。。

State を付けて書くと出るみたい。 setTitle:forState というメソッドでタイトルをつけてみると。

// btn.titleLabel.text = @”押してね“;  // でない

[btn setTitle:@”押してね!” forState:UIControlStateNormal];

OK. でる。

アップルのドキュメントをみると、これらを見ていけばボタンのタイトル周りは良さそう。

@property currentTitle– setTitle:forState:

最後に簡単な UIButton のサンプル

– (void)viewDidLoad

{

    [superviewDidLoad];

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    btn.frame = CGRectMake(0,0, 100, 40);

    btn.center = CGPointMake(self.view.center.x, 40);

    // btn.titleLabel.text = @”押してね“;  // でない

    [btn setTitle:@”押してね!”  forState:UIControlStateNormal];

    [btn addTarget:self action:@selector(go) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn];

}

くるまを好きなだけ並べてみよう!

3分でできるプログラミング

車を並べたいだけ並べて遊べるゲームです。
子供には、「並べたい」という子供の成長に重要な時期があるそうです。

くるまを並べよう

道具
 Xcode (これ書いている時点で使っているのは、ver4.3です) 
 iOS  (5.1 でためしました。)

Single View Application でプロジェクトを作成した後に、ViewController.m にこんな感じで実装を追加しましょう。(このアプリは、ViewController の実装のみで完了です。)

#import “ViewController.h”

@interfaceViewController ()

@end

@implementation ViewController

– (void)viewDidLoad

{

    [superviewDidLoad];

    self.view.backgroundColor = [UIColorgreenColor];

    // road

    // horizontal

    for (int i=0; i<3; i++) {

        double x = 0;

        double y = 120 * i + 35;

        double width = self.view.frame.size.width;

        double height = 80;

        UIView *road = [[UIView alloc] initWithFrame:CGRectMake(x, y, width, height)];

        road.backgroundColor = [UIColordarkGrayColor];

        // center line

        for (int j=0; j<5; j++) {

            UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 5)];

            line.center = CGPointMake(j * 70, road.bounds.size.height / 2.0);

            line.backgroundColor = [UIColor whiteColor];

            [road addSubview:line];

            [self.view addSubview:road];

        }

    }

    // 車を並べる

    [selflineupCars];

    // 発車ボタン

    UIButton *btn = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];

    btn.frame = CGRectMake(0,0, 50, 20);

    btn.center = CGPointMake(self.view.center.x, 15);

    [btn setTitle:@”Go!”forState:UIControlStateNormal];

    [btn addTarget:selfaction:@selector(go) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn];

}

– (void)lineupCars

{

    double carCenterY = self.view.bounds.size.height60;

    // clean old lineup

    for (UIView *v inself.view.subviews) {

        if (v.center.y == carCenterY) {

            [v removeFromSuperview];

        }

    }

    // 注意: mac じゃないと文字コードで化けるかも。

    // icons には使いたい絵文字を , 区切りで入れてください。

    NSArray *icons = [@”

丸角 UIView

メモ
丸角の View を 使いたい時は、「layer.cornerRadius 」を使うと簡単。
QuartsCore を使うので、Build Phase – Link Binary With Libraries にそれを追加。
(iOS 5 で実験)
サンプルコード

#import “ViewController.h”

#import <QuartzCore/QuartzCore.h>

@interfaceViewController ()

@end

@implementation ViewController

– (void)viewDidLoad

{

    [superviewDidLoad];

    self.view.backgroundColor = [UIColorwhiteColor];

    UIView *roundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0 , 100, 100)];

    roundView.center = self.view.center;

    roundView.backgroundColor = [UIColorblueColor];

    roundView.layer.cornerRadius = 20; //  丸角

    [self.view addSubview:roundView];

}

@end

 


アプリからブラウザ (Safari) を開く方法

自作アプリから、ボタン一発で Safari を開きたい!

そんな時はこうやれば動くみたい。
(iOS 5)

[[UIApplicationsharedApplication] openURL:@”ここにURL”]






ためしに、ボタン一発で Google を開くサンプルでも作ってみます。

Single View Application でプロジェクトを作成した後に、ViewController.m にこんな感じで実装を追加してみます。

– (void)viewDidLoad

{

    [superviewDidLoad];

    UIButton *btn = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];

    [btn setTitle:@”Open Google by safari”forState:UIControlStateNormal];

    [btn addTarget:selfaction:@selector(openBrowser) forControlEvents:UIControlEventTouchUpInside];

    btn.frame = CGRectMake(0, 0, 200, 50);

    btn.center = self.view.center;

    [self.view addSubview:btn];

}

– (void)openBrowser

{

    NSURL *url = [NSURLURLWithString:@”http://goolge.com”];

    [[UIApplicationsharedApplication] openURL:url];

}

これで OK

端末判定 iPad or iPhone どっち?

メモ

iPad と iPhone 両方に対応したアプリを作ろうと思ったとき、View の配置とかで、端末の判定をする場合、こんな感じで判定できそうです。

(※ iOS 5 で試してます。)

 1. iPad 用の処理を書きたいとき

    if ([[UIDevicecurrentDevice] userInterfaceIdiom] == 

UIUserInterfaceIdiomPad) {

// iPad 専用の処理を記述

    }

2. iPhone用の処理を書きたいとき

    if ([[UIDevicecurrentDevice] userInterfaceIdiom] ==

UIUserInterfaceIdiomPhone) {

// iPhone 専用の処理を記述

    }

iPodも iPhone と同じくくりでやればいいのかも。

animationWithDuration、CAAnimationCA 途中の座標を取得する方法

UIView の animationWithDuration、 CALayer の CAAnimation (CABasicAnimation, etc…)を使ってアニメーションさせている View(Layer) 座標の取得方法に関するメモです。
(iOS 5で試しています。)
アニメーション中のViewの座標を、view.center や、layer.position を使って取得しようとすると、アニメーション終了後の座標がとれてしまいます。そういう時は

[layerpresentationLayer];

を使えば、アニメーション中の座標を取得できるようです。
「実験」
簡単な図形を、アニメーションさせておいて、画面をタップするとその時点の図形の中心座標をログに出力するようにしてみます。
SingleViewApplication でプロジェクトを作成
ViewController.m に次の変更を行う。
1. インポートの追加

#import <QuartzCore/QuartzCore.h>

2. viewDidLoad で 左上から、真ん中に移動するような 青い四角 を作成

– (void)viewDidLoad

{

    [superviewDidLoad];

    // アニメーションさせるマーク 10×10で青

    UIView *mark = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];

    mark.backgroundColor = [UIColorblueColor];

    [self.view addSubview:mark];

    // 左上から真ん中に3秒かけて移動

    [UIViewanimateWithDuration:3animations:^{

        mark.center = self.view.center;

    }];

}

3. touchesBegan にて座標をログ出力する

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    // アニメーション中の座標を取得

    // 1. UIView property から

    UIView *mark = [self.view.subviews objectAtIndex:0];

    NSLog(@”¥n¥n UIView ———- x:%f, y:%f”, mark.center.x, mark.center.y);

    // 2. CALayer property から

    NSLog(@”¥n CALayer ——— x:%f, y:%f”, mark.layer.position.x, mark.layer.position.y);

    // 3. presentationLayer から

    CALayer *mLayer = [mark.layer presentationLayer];

    NSLog(@”¥n presentationLayer x:%f, y:%f”, mLayer.position.x, mLayer.position.y);

}

「結果」

こんなかんじで、presentationLayer を使えば、動いているViewの座標が取得できました。

 UIView ———- x:160.000000, y:250.000000

 CALayer ——— x:160.000000, y:250.000000

 presentationLayer x:31.265623, y:46.516628

 UIView ———- x:160.000000, y:250.000000

 CALayer ——— x:160.000000, y:250.000000

 presentationLayer x:61.037354, y:93.575172

 UIView ———- x:160.000000, y:250.000000

 CALayer ——— x:160.000000, y:250.000000

 presentationLayer x:100.058083, y:155.253098

 UIView ———- x:160.000000, y:250.000000

 CALayer ——— x:160.000000, y:250.000000

 presentationLayer x:159.100174, y:248.577682


指でくるくるする時計

3分でできるプログラミング
「指でクルクルする時計」です。

クルクルクロック

出来上がったら
 自分の作ったアプリで、こどもと一緒に「とけい」の勉強をしてみませんか。
道具
 Xcode (これ書いている時点で使っているのは、ver4.3です) 
材料
 QuartsCore.framework  ×1
 時計の針 ×2
 文字盤 ×1
とけいの針(短針と長針の二つ)を表示するためのClockHandという Object-Cクラスを作りましょう。
ヘッダファイルには、initWithFrame に針の長さと色を指定できるようにしたメソッドを ClockHand.h に追加します。
@interface ClockHand : UIView
-(id)initWithFrame:(CGRect)frame handLength:(float)length handColor:(UIColor*)color;
@end
実装していきます。ClockHand.m を開きましょう。
必要になる変数を用意します。@implementation ClockHand の上に次のコードを書きましょう。selected は気持ちよく針をクルクルさせるために、タッチイベントの発生と終了で設定する値です。
@interface ClockHand() {
    BOOL selected;              // 針がタップされていれば YES
    float handLength;           // 針の長さ
    CGPoint origin, handPoint;  // 時計の中心、針の先端
    UIColor *handColor;         // 針の色
}
@end
ヘッダに追加した init メソッドで、針の中心、長さ、色などを設定していきます。 @implementation ClockHand の下に、コードを書いていきましょう。時計の中心は、View の中心に設定しました。針の先端の初期位置は、y成分が0の3時方向としています。
-(id)initWithFrame:(CGRect)frame handLength:(float)length handColor:(UIColor*)color
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
        handLength = length;
        handColor = color;
        origin = CGPointMake(self.frame.size.width / 2.0, self.frame.size.height / 2.0);
        handPoint.x = origin.x + handLength;
        handPoint.y = origin.y;
        selected = NO;
    }
    return self;
}
View の描画部分を書いていきます。中心から、そのときの針の先端まで線を引く処理を次のように。
– (void)drawRect:(CGRect)rect
{
    [handColor set];
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(ctx, 10.0);
    CGContextSetLineCap(ctx, kCGLineCapRound);
    CGContextMoveToPoint(ctx, origin.x, origin.y);
    CGContextAddLineToPoint(ctx, handPoint.x, handPoint.y);
    CGContextStrokePath(ctx);
}
タッチイベントの処理を書いていきます。長針、短針が重なるように View を配置するので、下になったView を選択できるように、hitTest の実装を行います。針の先、30×30 の領域をタッチした場合、そのViewのtouch イベントを拾うようにします。
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    // 他の針がタッチで動くように、針の先端がタッチされたのでなければnil を返す。
    // ここを実装しないと、touch イベントが後ろに重ねた View に伝わらない。
    if (selected) {
        return self;
    }
    if (abs(point.x – handPoint.x) < 30 && abs(point.y – handPoint.y) < 30) {
        return self;
    }
    return nil;
}
指を離すまでは、タッチしたときに捕まえた針をまわすようにしたいので、touch の Begin, End, Cancel に selected に関する実装を行います。
– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    selected = YES;
}
– (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    selected = NO;
}
– (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    selected = NO;
}
針を実際に動かす処理を、touch moved に実装していきましょう。
– (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *t = [touches anyObject];
    CGPoint tp = [t locationInView:self];
    
    // とけいの中心からの距離
    float rx = tp.x – origin.x;
    float ry = tp.y – origin.y;
    
    // 針の長さを調整
    float r = hypot(rx, ry); // r = root(x^2 + y^2)
    float rate = handLength / r;  
    handPoint.x = rx * rate + origin.x;
    handPoint.y = ry * rate + origin.y;
    
    [self setNeedsDisplay];
}
以上で、針の実装は完了です。 
ViewController に組み込んでいきましょう。ViewController には次の二つのインポートが必要になります。(QuartzCore は追加ライブラリなので、Target – BuildPhases – Link Binary With Libraries に追加しておく必要があります。)
#import <QuartzCore/QuartzCore.h>
#import “ClockHand.h”
インポートしたら、viewDidLoad に実装を追加していきましょう。時計版の作成と短針、長針の作成を書いていきます。
– (void)viewDidLoad
{
    [super viewDidLoad];
    
    // とけい盤
    float r = 125.0;
    UIView *board = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 2 * r, 2 * r)];
    board.center = self.view.center;
    board.backgroundColor = [UIColor whiteColor];
    board.layer.cornerRadius = 125;
    board.layer.borderWidth = 5;
    board.layer.borderColor = [[UIColor darkGrayColo
r] CGColor];
    for (int i=0; i<12; i++) {
        UIView *hour = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
        hour.backgroundColor = [UIColor darkGrayColor];
        hour.layer.cornerRadius = 4;
        float rx = r + 0.9 * r * cos(2 * M_PI * i * (1.0/12.0));
        float ry = r + 0.9 * r * sin(2 * M_PI * i * (1.0/12.0));
        hour.center = CGPointMake(rx, ry);
        [board addSubview:hour];
    }
    [self.view addSubview:board];
    
    
    // とけいの短針
    ClockHand *shortHand = [[ClockHand alloc] initWithFrame:board.frame handLength:60 handColor:[UIColor redColor]];
    [self.view addSubview:shortHand];
    
    
    // とけいの長針
    ClockHand *longHand = [[ClockHand alloc] initWithFrame:board.frame handLength:110 handColor:[UIColor greenColor]];
    [self.view addSubview:longHand];
    
}
以上で完了です。
ぜひ、お試しください。
JUGEMテーマ:iphone

“指でくるくるする時計” の続きを読む