UITextViewとUIToolbar

UITextViewを使うとUITextFieldと違って完了ボタンが改行ボタンになっている。完了ボタンに変更もできるけど、改行もしたいからUIToolbarを使用して、そこに完了ボタンを配置してみる。

-(void) init
{
    toolBar = [[[UIToolbar alloc] init]];
    // ツールバーを配置する場所
    [toolBar setFrame:CGRectMake(0, 220, rootViewController.view.bounds.size.width, 44)];
    [hogeViewController.view addSubview:toolBar];

     // スペーサの生成
     UIBarButtonItem *spacer = [[UIBarButtonItem alloc]
     initWithBarButtonSystemItem:
     UIBarButtonSystemItemFlexibleSpace
     target:nil action:nil];

     // 完了ボタンの生成
     UIBarButtonItem *doneButton =
    [[[UIBarButtonItem alloc]initWithTitle:@"Done"
                                                style:UIBarButtonItemStyleBordered
                                                target:self
                                                action:@selector(onDoneButton)]autorelease];

     // スペーサを入れて左端に完了ボタンを配置する
     [toolBar setItems:[NSArray arrayWithObjects:spacer, spacer, doneButton, nil]];
}

// 完了ボタンがおされたとき
-(void)onDoneButton
{
    // キーボードを隠すなどの完了時の処理
}

キーボートが日本語とかになっていると、予測変換?のバーが出てきてせっかく作ったツールバーが隠れてしまう。。
ツールバーをキーボードのサイズで動的に変更することで解決しました。
方法は、ここに書かれているTextfiledを動的に変更する方法をツールバーに適応させればOK!!

UITextViewだと自分でいろいろカスタマイズ出来るけど、優しさが必要だな。

UITextViewあれこれ

UITextViewの実装でいろいろ試してみたのでのでメモ

  キーボード表示

遷移時にbecomeFirstResponder/textViewShouldEndEditing を使用すればキーボード編集開始/終了でデリゲートが呼ばれるはずなのに呼ばれない。。。
いろいろ試してみたら、addSubviewした後にbecomeFirstResponderすることでキーボードが表示された。
こんな感じ。

CGRect rect = CGRectMake(0, 0, 250, 50);
UITextView* textView UITextViewalloc] initWithFrame:rect];
textView.delegate = self;

[hogeViewController.view addSubview:textView];
[textView becomeFirstResponder];                // キーボードを表示

続いてデリゲートメソッドはこんな感じ。戻り値をNOにすると呼ばれなくなるので注意。

- (BOOL) textViewShouldBeginEditing: (UITextView*) textView
{
    // 編集開始時の処理

    return YES;
}

-(BOOL)textViewShouldEndEditing:(UITextView *)text
{
     // 編集終了時の処理
 
    return YES;
}

 

  テキストエリアを枠線&角丸にする

デフォルトのテキストエリアだとかなり悲しい感じなので枠線を付けて角丸にしてみます。

// 枠線
textView.layer.borderWidth = 1;
textView.layer.borderColor = [[UIColorblackColor] CGColor];
// 角丸
textView.layer.cornerRadius = 5;

layerを使用するために、QuartzCore.h のimportを忘れずに。
UITextViewってなんか扱いにくいなぁ。

objective-Cでの型変換

あんまり用途がないかなって思っていたけど、使う機会が何回かあったのでいくつかメモしておきます。

  NSString* から char*への変換

NSString* str = "hoge";
char* ch = [str UTF8String];

  char* から NSString*への変換

char* ch = "hoge";
NSString* str = [NSString stringWithCString:ch encoding:NSUTF8StringEncoding];

  NSString から int への変換

int value = [ @"123" intValue ]; 

※floatやdoubleに関しても同様にできるよ。

  int から NSString* への変換

NSString* value_str; 
value_str = [ NSString stringWithFormat : @"%d", 123 ];

Xcode4.5でopenFrameworksをビルド

Xcode4.5にあげて、oFをビルドしたら今までの作ったのものビルドが通らなくなった。。
設定を変更するだけで、問題なくビルド出来たのでメモとして残しておきます。

【環境】
Xcode4.5
openFrameworks007(古くてごめんなさい)
Target iOS6

①プロジェクトを開いて、「TARGETS」を選択し、「Build Setting」タブをクリック
②「Architectures」と「Valid Architectures」を「armv7, armv7s」から「armv7」に変更する

これで後はCleanしてBuildで問題なくビルドが通りました。

Xcodeのバージョンがあがるたびにドキドキする。

Firefox OSを試してみたよ。

Firefox OSがWin/Mac/Linuxに入れるみたいだから入れてみたよ。
【環境】
 OS : Ubuntu 12.04

インストールは簡単でここからタウンロードする。

タウンロードしたら適当なフォルダに格納して解凍する。

$ tar Icvf b2g-18.0a1.en-US.linux-i686.tar.bz2

解凍先のb2gディレクトリ移動して、gitからGaiaをチェックアウトする。

$ cd ~/b2g
$ git clone git://github.com/mozilla-b2g/gaia

次にプロファイルの作成します。ちょっと時間がかかるので辛抱強く待つ。

$ make -C gaia profile

プロファイルを指定してb2gを起動する。これでGaia UIが起動する。

$ ./b2g -profile gaia/profile

こんな感じ。

メモ(chkconfigのランレベル)

いつもchkconfigのランレベルを忘れちゃうのでメモを。

ランレベル  モード
  0     システムの停止モード
  1     シングルユーザモード
  2     マルチユーザモード(ネットワークなし)
  3     マルチユーザモード(テキストログイン)
  4     カスタムモード(未使用)
  5     マルチユーザモード(グラフィカルログイン)
  6     システムの再起動モード

ちなみにサービスを個別に指定する場合は以下のとおり。

$ chkconfig –level 3 サービス名 on

確認

$ chkconfig –list サービス名
サービス名 0:off 1:off 2:on 3:on 4:on 5:on 6:off
$

iptablesの設定

apacheの設定に続いて、iptablesの設定も書いときます。

まずはファイルが無いので作成する

$ sudo vi /etc/sysconfig/iptables

開いたら以下を書いて閉じる。
※可読性をよくするためにスペースを入れるけど、実際に書く時はスペースなしで。

*filter
#このホストに対して入ってくるパケットを通過させるか遮断させるかを設定
#すべてのパケットを許可([0:0] : 「パケットカウンタ:バイトカウンタ」)
:INPUT ACCEPT [0:0]					
 
#このホストを経由するパケットに対しての設定
:FORWARD ACCEPT [0:0]				
 
#このホストから送られるパケットに対する設定
:OUTPUT ACCEPT [0:0]
 
# ユーザ定義チェーン
:RH-Firewall-1-INPUT - [0:0]
 
#「-j」オプション:あるチェインを別チェインにジャンプさせる.
# ここではINPUTチェインを、ユーザー定義チェインにジャンプさせることで、INPUTとFORWARDチェインで入ってくるパケットをユーザー定義チェインでチェックさせる。
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
 
# ループバック(lo)は通信を許可する。
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
 
# pingで疎通確認したいからICMPも通信を許可する。
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
 
#「-p」に続けて番号を入力することで、プロトコルを指定
# 50(ESP)と51(AH)を許可
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
 
#「5353」:マルチキャストDNS
# これは専用のアドレス「224.0.0.251」にパケットを投げて応答をもらうことで、
# わざわざIPアドレスとホスト名の変換を行わなくてもマシンを認識できる仕組み。
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
 
# ポート「631」は印刷データの送受信のためのプロトコルで、これも「ACCEPT」で許可。
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
 
# この「state」はパケットの状態を指定するためのモジュール。
# 今回は「ESTABLISHED(過去に接続されたことがある)」または「RELATED(既存の接続に関係している)」と
# 見なされた場合に、接続を許可する。
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
#「-m tcp」でtcpモジュールを有効にした後に、「-p tcp」でプロトコルがtcpの場合に限定する。
# SSH, HTTP, FTP1, FTP2, MYSQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
 
# 接続許可のルールに一致しなかったパケット。
# それらのパケットはすべて「REJECT(エラーパケット送信)」します。
#「–reject–with」はエラーパケットの種類を指定するためのもので、
# 今回は「icmp-host-prohibited(ホストによって禁止されました)」というメッセージを送るように指定しています。
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

設定が完了したらiptablesを再起動させます。

$ sudo /etc/rc.d/init.d/iptables restart