ぼりぼり農園

iPhoneアプリ開発しながらObjective-CとPerlとLinuxとネタ集め。家に大きめの机欲しい。あとイス。

【Objective-C】Reachability - iOSのネットワーク接続状況を確認する公式ライブラリ

そうだ七夕だ!!笹の葉さらさらじゃんか!!

やりたいこと

iOSのネットワーク接続状況に応じてアラートを出すような処理(特に圏外を検知したい事が多い気がする)

Appleが公式ライブラリ「Reachability」を公開しているので、それを使って実装するのがよいです。

実装準備

  1. ここからサンプルコードをDL
  2. SystemConfiguration.frameworkをプロジェクトにインポート
  3. Reachability.hとReachability.mをプロジェクトにインポート
  4. 使用したいファイルにReachability.hをインポートして準備完了

実装

Reachabilityには色々機能が設定されてますが、基本はネットワーク接続状況を確認するのに使うはずなので、下記を実装すればOKです。

// ネット接続状態確認
currentReachability = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [currentReachability currentReachabilityStatus];
    
switch (netStatus)
{
    case NotReachable:        {
        // 圏外の場合の処理
        break;
    }
    case ReachableViaWWAN:        {
        // 携帯回線に接続可能な場合の処理
        break;
    }
    case ReachableViaWiFi:        {
        // wifiに接続可能な場合の処理
        break;
    }
}

サンプルアプリコード

GitHubに置きました。
ボタンを押すとネットワーク接続状況確認できるだけの簡単なものです。
変な所、改善点等あればご指摘いただけると狂い悶えるのだ...喜びでなッ!!

ReachabilityDemo

iPhoneアプリ開発のコツとツボ35

iPhoneアプリ開発のコツとツボ35

【Objective-C】UIScrollViewで余白を活かしたページングを実装する裏ワザ

下記の様な、地図上でスポットを探すアプリみたいにUIScrollViewでラベルを横一列に並べた時のページングの時に、余白を利用してエレガントに実装するのがうまくいかず悩んだので解決法メモ。もっといい方法というか正攻法等あればどなたか教えてもらえると嬉しいです。コードは下に記載。

やりたいこと

こんな感じのアプリ画面を作りたいとして。
UIScrollView01

  1. ScrollViewでページングを量産する
  2. 各ページングするScrollView同士の間に余白を取る
  3. 少し前後のScrollViewが見切れるようにする
  4. 見切れる範囲は画面一杯でなく特定のView内に限定する

何px移動するかをちゃんと割り出す

UIScrollView02
考えるべきは、「コンテンツがページングしてどう見えるか」ではなくて、「1ページあたり何px移動するのか」

今回で言えば、1ページングする毎に
「コンテンツの274px」+「余白の4px」=278px
移動していますね。

でもここまでは考えると思うんです。

陥りがちなのが、「1ページ目は左に余白がないので少なめで、2ページ目以降は追加したコンテンツの余白分足した分だけ移動するのか…」などと考え始めると確実に死にます。いくらページングしたくてもうまくいかないので、そのうちカーズのように考えるのをやめる事になります。

余白を含めてスライド領域として考える

じゃあどうすればいいのだ!となりますが、ここで重要なのは、目に見えるコンテンツではなく、余白も含めてコンテンツだと考えることです。自分はこの境地に至るまで情けない事に2日程かかりました。
UIScrollView03
上図のように考えれば答えが見えてきます。

ページングするViewはあくまで透明なViewで、見えているコンテンツはその上にただ余白を空けて乗っかってるだけ

という事が見えてくるはず。意外と簡単なのではないか。
余白なんて考えなくていいんや!

実装

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor redColor];
    
    // 地図View
    UIView *mapView = [[UIView alloc] init];
    mapView.frame = CGRectMake(10, 100, 300, 400);
    mapView.backgroundColor = [UIColor greenColor];
    [self.view addSubview:mapView];
    
    // スクローラーを載せるラベル設定(余白を含む透明のビュー)
    UIView *scrollerRootView = [[UIView alloc] init];
    scrollerRootView.frame = CGRectMake(0, 300, 300, 54);
    [mapView addSubview:scrollerRootView];
    scrollerRootView.backgroundColor = [UIColor clearColor];  // 透明だけど使えるViewとして存在させる(本当はこの行は不要)
    scrollerRootView.clipsToBounds = YES; //このラベルをはみ出た画像は見えないようにする
    
    // スクローラーの設定
    UIScrollView *scroller = [[UIScrollView alloc] init];
    scroller.frame = CGRectMake(11, 0, 278, 54);
    scroller.clipsToBounds = NO; // スクローラーをはみ出ても画像が見える様にする
    scroller.bounces = NO;  // 弾ませない
    scroller.showsHorizontalScrollIndicator = NO;  // スクロールバーを出さない
    scroller.pagingEnabled = YES; // ページングを許可
    [scrollerRootView addSubview:scroller];
    
    
    // スクローラーにコンテンツを載せる(5ページ分)
    for (int i = 0; i < 5; i++) {
        UIView *scrollerView = [[UIView alloc] init];  //
        float color = (i + 1.0) / 5.0;
        scrollerView.backgroundColor = [UIColor colorWithRed:color green:color blue:color alpha:1]; //ページごとに色を変えてみる
        NSLog(@"%f",color);
        [scroller setContentSize:CGSizeMake((274+2+2)*(i+1), 54)]; // スクロールする全体の範囲
        scrollerView.frame = CGRectMake(2+(274+2+2)*(i), 0, 274, 54); // ページングする下地のView分移動して配置
        [scroller addSubview:scrollerView];
    }
    
    // スクローラーの初期位置を1ページ目の位置にする
    [scroller setContentOffset:CGPointMake(0, 0) animated:YES];

}

ソース一式はGitHubに上げてみました

GitHub緊張。
変な所、改善点等あればご指摘いただけると狂い悶えるのだ...喜びでなッ!!
UIScrollViewPagingDemo

iPhoneアプリ開発のコツとツボ35

iPhoneアプリ開発のコツとツボ35

【超初心者Linux】第2夜:基本コマンドを使いながら覚えるのれす!(pwd,cd,ls,mkdir,rmdir,cp,mv,rm)

はー小人かわいい。
前回導入したVirtualBoxCentOS上で、Linuxの超基本コマンドを、順番に打ちながら覚えていきます。

今日のレシピ

  1. pwd:現在のディレクトリ(カレントディレクトリ)を確認
  2. ls:ディレクトリの内容を表示
  3. cd:ディレクトリを移動
  4. ディレクトリ名を英語表示にする
  5. mkdir・rmdir:ディレクトリの作成・削除
  6. cp:ファイル、ディレクトリのコピー
  7. mv:ファイル、ディレクトリ名の変更
  8. rm:ファイルを含むディレクトリの削除
  9. shutdown:ターミナルから端末をシャットダウン

ターミナルを開く

前回minimal desktopで初期設定したので、起動するとデスクトップが表示されます。
[ターミナル]>[システムツール]>[端末]で開きます。
f:id:dogrunaway:20131125210455p:plain

pwd:現在のディレクトリ(カレントディレクトリ)を確認

基本コマンド。最初にpwdと打ってEnterすると、ホームディレクトリが表示されました。
print working directoryの略だそう。
linux02_02

ls:ディレクトリの内容を表示

lsとだけ打つと、現在のディレクトリの内容を表示します。
lsの後ろに半角スペースをはさみ、以下のオプションをつけることで、より詳細な情報を表示したりすることができます。

<オプション>
-l:ファイルの詳細情報も同時に表示
-a:隠しファイル/フォルダを含む全ファイルを表示

linux02_03
また、オプションは合わせ技が可能。
下記のようにすると、全てのファイルを詳細付きで表示できます。

$ ls -al

linux02_04

cd:ディレクトリを移動する

Linuxファイルシステムは階層構造になっていて、最上部の「/(ルート)」の下に各ディレクトリが配置されています。ディレクトリを移動するには「cd」コマンドを利用します。
自分は、この「1つ上のディレクトリに移動する」を知らなくてね…聞けなくてね…苦労したね…

cd 「移動先のディレクトリ」 「移動先のディレクトリ」へ移動
cd / ルートディレクトリへ移動
cd /home/ユーザ名 ホームディレクトリに移動
cd .. 1つ上のディレクトリに移動
cd ../.. 2つ上のディレクトリに移動

linux02_05

ディレクトリ名を英語表示にする

ところでこの「デスクトップ」とか「写真」とか「公開」とかいうディレクトリ名はサーバやりたいならカッコ悪いし、気持ち的に英語表記にしたいですよね。しましょう。ターミナルで下記を打ち込みます。

$ LANG=C xdg-user-dirs-gtk-update

linux02_06

設定変更の確認画面が表示されます。下記の通り進めれば完了簡単!

linux02_07

mkdir・rmdir:ディレクトリの作成・削除

mkdir ディレクトリ名 ディレクトリを作成。make directory。
rmdir ディレクトリ名 ディレクトリを削除。remove directory。

linux02_08

cp:ファイル、ディレクトリのコピー

cp ファイル名 コピー先 ファイルを、コピー先にコピー
cp -a ディレクトリ名 コピー先 ディレクトリをコピー先にコピー

「mkdir test」でtestディレクトリを作成。
「cd test」でtestへ移動。
「mkdir sub」でtestディレクトリ内にsubディレクトを作成。
「ls -a > test_file」で、lsコマンドの出力内容を「test_file」ファイルに書き出しつつ、ファイルの内容を確認。
「cp test_file sub」でsubにtest_fileをコピー!
「cp sub /home/mikosick」でホームディレクトリにsubディレクトリをコピー!
しようとするもエラー。オプション「-a」を入れてないから。
「cp -a sub /home/mikosick」で無事成功。
linux02_09

ところで、さっき「ls -a > test_file」で書きだしたtest_fileの中身ってどんなのか気になるよね?vimで見てみましょう。
vimは、ターミナル上で動くテキストエディタのようなもの。ターミナル上で「vimtutor」と打ってみると幸せになります。)
linux02_10

test_fileの中身。ls -aの出力内容がそのまま見えますね。
linux02_11

mv:ファイル、ディレクトリ名の変更

mvコマンドでファイル名、ディレクトリ名を変更します。

mv ファイル/ディレクトリ名 変更後の名称 ファイル/ディレクトリ名を変更後の名称に変更

linux02_12

rm:ファイルを含むディレクトリの削除

rmdir でディレクトリを削除しようとしても、中にファイルが存在するとエラーになります。
こんな時には2通りのやり方があります。

<方法1>
ディレクトリに移動して、中のファイルを一個一個消して、全部消してからディレクトリを削除します。通常は慎重に作業する必要があるので、この方法が一番確実。
linux02_13

<方法2>
rmコマンドで、ファイルを削除することができます。
これに「-r」オプションを付けることで、ディレクトリ全体を一気に削除する事も可能。

rm ファイル ファイルを削除
rm -r ディレクトリ ディレクトリを中身ごと全削除

linux02_14

shutdown:ターミナルから端末をシャットダウン

シャットダウンするには下記のコマンドをターミナルから実行します。

shutdown -h now 今すぐシャットダウン
shutdown -r now 今すぐ再起動

shutdownコマンドを利用するには、root権限が必要になります。
なので、まずは「su -」を打ってログインしてから実行します。
linux02_15

これで基本の基本コマンドは完了!お疲れ様でした。

この本で勉強してるよ!

10日でおぼえるLinuxサーバー入門教室 CentOS対応 (10日でおぼえるシリーズ)

10日でおぼえるLinuxサーバー入門教室 CentOS対応 (10日でおぼえるシリーズ)