Home > Archives > 2010年3月 Archive

2010年3月 Archive

AS3 文字数入力制限と文字数カウント

  • Posted by: goron
  • 2010年3月29日 20:57
  • AS3

今日はAS3です。
タイトルの通り、文字数入力制限と文字数カウント。
グーグル先生に聞けば沢山出てくるのですが、自分的メモ。

TextFieldの文字数制限にmaxCharsを使えば文字数を制限できます。
ただ、半角全角も判定したいときには使えないです。

それで、ByteArrayを使えばよいとのことでやってみました。
(全角16文字、半角32文字)

private var tempStr:String;//前回入力時のstringがはいる

private function textInputCheck(tf:TextField):void {
var maxNum = 32;
var byteArray:ByteArray = new ByteArray();
byteArray.writeMultiByte(tf.text, "shift_jis");
var len:int = byteArray.length;

if ( len > maxNum) {
trace("制限数以上");
tf.text = tempStr;
} else {
tempStr = tf.text;
}
}


TextField の FocusEvent.FOCUS_OUTやKeyboardEvent.KEY_UPで呼んでみました。

※ただ、これだと日本語入力で確定前のテキストは上手く判定されません。。。

次は文字数のカウント。こちらも全角半角も判定します。
基本的にbyteArrayを使うことは変わりありません。
全角10文字、半角20文字以上の場合、その文字列に「...」をつけます。

private function stringNum(str:String):String {
	var maxNum = 20;
	var byteArray:ByteArray = new ByteArray();
	byteArray.writeMultiByte(str, "shift-jis");
	var len:Number = byteArray.length;
			
	if (len > maxNum) {
	 var counter:Number = 0;
	 var i:Number = 0;
	 var myString:String = "";

    //1文字づつstringを取り出してカウント
 while (maxNum>counter) {
if (str.charCodeAt(i)<=255) {
          //半角の場合
counter += 1;
} else {
          //全角の場合
counter += 2;
}
var getStr:String = str.substr(i, 1);
myString+=getStr;
i++;
  }
  
      myString += "...";
}else {
       //指定した文字数以下の場合はそのまま
myString = str;
}

return myString;
}


参考にさせて頂いたサイト
http://air.creator.ms/bytearray.html


さぁ、これをObjective-Cでやるにはどうするんじゃ?


iPhone Core Animation レイヤーアニメーションについて

  • Posted by: goron
  • 2010年3月20日 17:22
  • iPhone

今日MacBookPro届いたよ。整備品だけど。
なぜかDVDの読み込みエラーになる時がある。整備品だからかと疑いたくなる。

あぁぁぁ、ほんとう情報が少ない。。Core Animation。ハマりまくり。
CABasicAnimation で使ってフラッシュでいうTweenerみたいなことをしたいと思っていて。
単純に、1つの動作をさせることは簡単に分かったのですが(例えば、拡大だけとか、回転だけとか)。
でも、拡大しながら回転させたい時はどうするんだよっと。公式ドキュメントやら読んでみたけど、意味不明でした。2つ並べても1つしかアニメされないし。。。

でも、洋書のCore Animationに書いてありました。あっさりと。買っておいて良かった。。。
Core Animation: Simplified Animation Techniques for Mac and iPhone Development (Core Frameworks Series)

知ってみれば答えは、簡単
CATransform3DConcat を使えば良い。

CATransform3D rotateAnim;
CATransform3D transformAnim;
CATransform3D combine;

//1秒で回転しながら拡大
CABasicAnimation *animation =[CABasicAnimation animationWithKeyPath:@"transform"];
animation.duration=1.0;
animation.repeatCount = 0;
animation.delegate = self;

//拡大準備
transformAnim = CATransform3DMakeScale(0.1f, 0.1f, 0.1f);
//回転準備
rotateAnim = CATransform3DMakeRotation(-180 * M_PI / 180.0, 0.0, 0.0, 1.0);
//上記2つを合体させる
combine = CATransform3DConcat(transformAnim, rotateAnim);
//アニメの始まりをセット
animation.fromValue =[NSValue valueWithCATransform3D:combine];

//拡大終了時
transformAnim = CATransform3DMakeScale(1.0f, 1.0f, 1.0f);
//回転終了時
rotateAnim = CATransform3DMakeRotation(0 * M_PI / 180.0, 0.0, 0.0, 1.0);
//上記2つを合体させる
combine = CATransform3DConcat(transformAnim, rotateAnim);
//アニメの終わりをセット
animation.toValue =[NSValue valueWithCATransform3D:combine];

//最後にレイヤーに適用する
[imageLayer addAnimation:animation forKey:@"kRotateKey"];


iPhone UIBarButtonItem ボタンの色を変えたい場合

  • Posted by: goron
  • 2010年3月19日 15:06
  • iPhone

UIBarButtonItemのボタンの色を変えたいときのメモ。
backgroundColorとかtintColorとか試したのですが駄目でした。

下記を参考にしました。
Color image on a UIBarButtonItem on a UIToolBar?

参考サイトのとおり、発想を変えてカスタムUIButtonを貼付ければ良いということです。

//ボタンの画像を用意
UIImage *buttonImage = [UIImage imageNamed:@"someImage.png"];

//画像からボタンを作成
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:buttonImage forState:UIControlStateNormal];

//大きさを指定して
button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);

//UIBarButtonItemのinitWithCustomView:でinitすればできあがり。
UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];


ここでもう一つメモ。
このcustomBarItemにactionを設定したいですね。
はじめ、
customBarItem.action = @selector(処理);
としていたのですが、セレクタが呼ばれません。。。

解決策は、UIButtonの方にactionをすればよかったのです。
[button addTarget:self action:@selector(処理) forControlEvents:UIControlEventTouchUpInside];

めでたしめでたし。



iPhone UIKeyboard メモ

  • Posted by: goron
  • 2010年3月12日 12:26
  • iPhone

2度ほど忘れたので、UIKeyboardを出す/消すのメモ。


画面表示と同時にキーボードを出す。およびテキストフィールドにフォーカスする。
- (void)viewDidLoad {
 [super viewDidLoad];
 UITextField *textField = [[UITextField alloc]init];
 [self.view addSubview:textField];
 //これでキーボード出す
 [textField becomeFirstResponder];
}


//テキスト編集開始時にリターンキーを設定
//リターンを押すと- (BOOL)textFieldShouldReturn:(UITextField *)textFieldが呼ばれる
- (void)textFieldDidBeginEditing:(UITextField *)textField{
 textField.returnKeyType = UIReturnKeyDone;
}


UITextFieldDelegate プロトコルをヘッダーファイルに追加して
テキスト入力後、リターンキーでキーボードを消す
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
 [textField resignFirstResponder];
 return YES;
}


iPhone メモ 拡大アニメ縮小率0.0だと。。。

  • Posted by: goron
  • 2010年3月11日 12:57
  • iPhone

UIViewの拡大アニメで、時間を取られたのでメモ。

UIViewのアニメーションを使う場合、下記みたいに
beginAnimations:context: 〜 commitAnimations で囲めば
その間に入れたviewオブジェクトがアニメしてくれる訳です。

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
//アニメするオブジェクト
viewObj.transform = CGAffineTransformMakeScale(1.0, 1.0);
[UIView commitAnimations];

この例では0.5秒で、viewObjを拡大縮小のプロパティtransformで元のサイズに戻るアニメですね。
このブロックの前で
viewObj.transform = CGAffineTransformMakeScale(3.0, 3.0);
と設定しておけば、3倍の大きさから元サイズへ縮小するアニメーションになる訳です。

つまずいたのは、アラートウインドウのように拡大して現れる設定を下記のようにしたときです。
viewObj.transform = CGAffineTransformMakeScale(0.0, 0.0);

0.0から1.0へと設定したつもりでしたが、なぜか0.0だとアニメしてくれません。
フラッシュやらAfterEffectなどでは0から開始させていたので問題ないと思ったのですが。。。
結果、0.1にしたら問題無く動いていました。
なんでだろう?


iPhone スレッドで処理する

  • Posted by: goron
  • 2010年3月10日 22:23
  • iPhone

自分で書いたブログが役に立った日!
やっぱりログを取っておくべきですね。久々に更新します。
今日はadHocで配信してみましたよ〜。やり方教わりながらだからできたけど、もう一度自分でゼロからやるには大変そう。いずれログにします。

今日はiPhoneで超簡単スレッドの巻。
そもそも自分はスレッドの意味があまり分かっていないのだけど、画像処理している間、フリーズ状態になるので、Active indicatorを出したいな〜と思っていたら、やはり別スレッドで処理しないといけないとのこと。で、グーグル先生に聞いてみると、超簡単なやり方を教えてもらいました。
※追記:detachNewThreadSelector:toTarget:withObject:だとメモリリーク起きてました。。。

[NSThread detachNewThreadSelector:@selector(メソッド) toTarget:ターゲット withObject:オブジェクト];
[self performSelectorInBackground:@selector(メソッド) withObject:オブジェクト];
でメソッドを呼べばよいみたい。

そんでメソッドでは、
-(void)メソッド {
NSAutoreleasePool* pool;
pool = [[NSAutoreleasePool alloc]init];

ここに処理を実装

[pool release];
[NSThread exit];
}

とこれだけだった。
実際、detachNewThreadSelector:toTarget:withObject: performSelectorInBackground:withObject:を呼んですぐにメインループに戻ってきました。すばらしい。

でも、他のサイト見ていると、メモリリークが起こるとか書いてあるページがあったので、要注意かも。まだメモリリークのチェックはしてません。。。NSThreadだとメモリリークおきます。


参考サイト:
http://www013.upp.so-net.ne.jp/tanken/Tanken/no9_MultiThread/no9_MultiThread.html


Index of all entries

Home > Archives > 2010年3月 Archive

Profile

iPhone/iPad開発 web制作:平野百貨店
iPhone/iPad開発・web制作・映像制作をしている平野百貨店の店長個人の覚書です。
ご意見・ご感想などお問合せはコチラからどうぞ。

※最近ツッコミをもらうので一応書いておきます。ブログのタイトル「袖触れ合うも多少の縁」はわざとです。正確には「袖振り合うも多生の縁」が正解です。

Search
iPhone Apps






RSS
リンク
のこぎりそうの日記

Return to page top