ラベル Objective-C の投稿を表示しています。 すべての投稿を表示
ラベル Objective-C の投稿を表示しています。 すべての投稿を表示

2012年5月7日月曜日

カメラロールのステータスバーを非表示にする

カメラロール(UIImagePickerController)のステータスバーを非表示にする方法を紹介します。やり方は
UIImagePickerControllerを継承してviewWillAppear内でステータスバーを非表示にする
です。
この方法でステータスバー非表示だけでなくナビバーを消したり、ツールバーを表示したり、いろいろカスタマイズできます。継承して拡張するってやつですね。
それではソースを見てみましょう。
◎ポイント
  1. オーバーライドしたviewWillAppear内でsuperのviewWillAppearを呼び出だしましよう。呼び出さないとスーパークラス(
    UIImagePickerController)のviewWillAppearが実行されなくなってしまいます。
このエントリーをはてなブックマークに追加

2012年5月1日火曜日

iPhoneでアプリ全体のタッチ操作を有効にしたり無効にしたり

アニメーション実行中や通信中等ユーザーからのタッチ操作を受け付けたくない場合にアプリへのタッチ操作を受け付けなくすることができます。

このエントリーをはてなブックマークに追加

2012年4月30日月曜日

isKindOfClassとisMemberOfClassってなにが違うねん

ってことで調査したところ継承関係も含めて判定するかどうかのようです。
isKindOfClass:継承関係内に指定クラスが存在すれがYESを返却する
isMemberOfClass:allocしたときのクラス(ちょっと自信ない)が指定クラスならYES
以下検証プログラム

このエントリーをはてなブックマークに追加

2012年4月20日金曜日

UIWebViewでiOSのシステムフォントを使いたいよ

ってことで
まぁheadタグでフォントに「Helvetica Neue」をしていすればよい訳です。
「Helvetica NeueUI」じゃないのか?!って思ったんですけど表示が変わりませんでした。
このエントリーをはてなブックマークに追加

iOSのシステムフォントって実際なんなの?

ってことでしらべてみましたYO
検証結果は「Helvetica NeueUI」でした。
以下検証内容

UIFont *font = [UIFont systemFontOfSize:12];
NSLog(@"font-info:%@", font);
 

font-info: font-family: ".Helvetica NeueUI"; font-weight: normal; font-style: normal; font-size: 12px
 
このエントリーをはてなブックマークに追加

2012年4月6日金曜日

UITextViewでキャレットの位置を先頭、後尾に移動するパート2

先日作ったキャレット位置を先頭に移動したり、後尾に移動するメソッドがxcodeのAnalyze
でワーニングが出てしまうので作り直しました。


@interface UITextView (extend)
// キャレット位置の設定
typedef enum {
    UICTextViewCaretPositionHead = 0, // 先頭
    UICTextViewCaretPositionTail  // 後尾
}UICTextViewCaretPositionType;
- (void)setCaretPosition:(UICTextViewCaretPositionType)_caretPositionType; 
@end
   
@implementation UITextView (extend)
- (void)setCaretPosition:(UICTextViewCaretPositionType)_caretPositionType
{
 // キャレットを移動する為の選択範囲情報
 NSArray *rangesAtCaretPosition = [NSArray arrayWithObjects:
           [NSValue valueWithRange:(NSRange){0, 0}],      // 先頭
           [NSValue valueWithRange:(NSRange){[self.text length], 0}], // 後尾
          nil
           ];

 // 引数チェック
 if ([rangesAtCaretPosition count] <= _caretPositionType) {
  @throw [NSException exceptionWithName:@"invalid argument error" reason:@"out of range:_caretPositionType" userInfo:nil];
 }

 // キャレットを移動
 NSRange range;
 [[rangesAtCaretPosition objectAtIndex:_caretPositionType] getValue:&range];
 self.selectedRange = range;

}

@end
  
NSValueを使ってNSArrayに保存するように修正しまいた。
このエントリーをはてなブックマークに追加

2012年4月5日木曜日

[NSMutableString stringWithString:nil];で落ちた

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSPlaceholderMutableString initWithString:]: nil argument'
*** First throw call stack:
[NSMutableString stringWithString:_url];
 

メソッドの引数を[NSMutableString stringWithString:url];って実装してたら落ちました。どうやらnil指定だと落ちるようです。
nilの場合は空文字(@"")に置き換えてlogを出力するように修正しました。

if (nil == _url) {
  _url = @"";
  NSLog(@"url is nil");
 }
 
このエントリーをはてなブックマークに追加

2012年3月27日火曜日

UITextViewでキャレットの位置を先頭、後尾に移動する

UITextViewのキャレット位置を先頭に移動したり、後尾に移動するメソッドをつくりました。

@interface UITextView (extend)
// キャレット位置の設定
typedef enum {
    UICTextViewCaretPositionHead = 0, // 先頭
    UICTextViewCaretPositionTail  // 後尾
}UICTextViewCaretPositionType;
- (void)setCaretPosition:(UICTextViewCaretPositionType)_caretPositionType; 
@end
   
@implementation UITextView (extend)
- (void)setCaretPosition:(UICTextViewCaretPositionType)_caretPositionType
{
 // キャレットを移動する為の選択範囲情報
 const NSRange rangesAtCaretPosition[] = {
            {0, 0},     // 先頭
            {[self.text length], 0} // 後尾
           };
 // キャレットを移動
 self.selectedRange = rangesAtCaretPosition[_caretPositionType]; 

}

@end
  

※注目してほしいところ
  1. データとロジックを分けるという考え方に基づいて設計している。
  2. あれ?if文もswitch文も使われてないYO!
これanalyzeするとワーニングがでますね。orz


新しく記事を書いたよ
http://yskmanabe.blogspot.jp/2012/04/xcodeanalyze-interface-uitextview.html
このエントリーをはてなブックマークに追加

2012年3月26日月曜日

Objective-CでURLをaタグで囲む

ツイート内のURLをaタグで囲みたいよー
ということで囲んでくれるメソッドを作成しました。


あれ?pre使ってるのにうまく表示されない部分が。。。
<¥/%@>
の¥は削除してください。

正規表現を使って置換しています。
メソッド名がしっくりこないのは気のせいだろうか。。。
このエントリーをはてなブックマークに追加

2012年2月22日水曜日

NSOperationのdeallocが呼ばれなくてハマりました

ひさしぶりにメモリ関連でハマりました。
NSOperationのdeallocが呼び出されなくてメモリーリークしまクリスティ。
setCompletionBlock内でoperation自身を参照したのが原因のようです。「自分で自分のリテインカウントをインクリメントして保持」てきなことが起こっているのかな?

// オペレーションがqueueから削除された時の処理設定
 [anOperation setCompletionBlock:^{
  // delegateに通知
  if (_delegate) {
   [_delegate netWorkConnector:self requestOperationCompleted:_request];
  }
  
  // 保持しているrequestの解放
  [operations removeObject:anOperation];
  if ([operations count] <= 0) {
   [self.delegateOperationDictionary removeObjectForKey:pointerOfDelegate];
  }
  GNRLoggerDebug(@"-- operation  completed --");
 }];
 

operationのアドレス情報を別変数に入れることで解決しました。
// オペレーションがqueueから削除された時の処理設定
 NSNumber *p = [NSNumber numberWithInteger:(NSInteger)anOperation];
 [anOperation setCompletionBlock:^{
  // delegateに通知
  if (_delegate) {
   [_delegate netWorkConnector:self requestOperationCompleted:_request];
  }
  
  // 保持しているrequestの解放
  [operations removeObject:(id)[p integerValue]];
  if ([operations count] <= 0) {
   [self.delegateOperationDictionary removeObjectForKey:pointerOfDelegate];
  }
  GNRLoggerDebug(@"-- operation  completed --");
 }];
 

まぁ原因の根本はBlocksの知識がしょっぱいからに違いない。。。
このエントリーをはてなブックマークに追加

2012年2月20日月曜日

No previous prototype for function 'functionname'ってwarningの対処

スタティックなメソッドなのにstaticが付いてませんでした。
なので
static int hoge;
こんな感じにstaticをつけてやることで解消しました。
このエントリーをはてなブックマークに追加

2012年2月19日日曜日

viewのx座標だけ、y座標だけ、widthだけ、heightだけ変更したい

UIViewのwidthだけ変更したいのに
@interface UIView (extend)
aView.frame = CGRectMake(aView.frame.origin.x, aView.frame.origin.y, 100, aView.frame.size.height);
@end
って書くのまんどくせー。
ってことで下記のようなUIViewの拡張メソッドを用意して使っています。

@interface UIView (extend)
- (void)setX:(NSInteger)x;
- (void)setY:(NSInteger)y;
- (void)setWidth:(NSInteger)width;
- (void)setHeight:(NSInteger)height;
- (void)setOrigin:(CGPoint)point;
- (void)setSize:(CGSize)size;
@end
 


#import "UIView+extend.h"


@implementation UIView (extend)



- (void)setX:(NSInteger)x

{

 self.frame = CGRectMake( x, self.frame.origin.y, self.frame.size.width, self.frame.size.height );

}

- (void)setY(NSInteger)y

{

 self.frame = CGRectMake( self.frame.origin.x, y, self.frame.size.width, self.frame.size.height );

}

- (void)setWidth:(NSInteger)width

{

 self.frame = CGRectMake( self.frame.origin.x, self.frame.origin.y, self, view.frame.size.height );

}

- (void)setHeight:(NSInteger)height

{

 self.frame = CGRectMake( view.frame.origin.x, view.frame.origin.y, view.frame.size.width, height );

}



- (void)setOrigin:(CGPoint)point {

 self.frame = CGRectMake(point.x, point.y, self.frame.size.width, self.frame.size.height);

}

- (void)setSize:(CGSize)size {

 self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, size.width, size.height);

}



- (void)setViewSizeHalf:(UIView*)view {

 view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width/2, view.frame.size.height/2);

}

@end
 

#import "Hoge.h"
#import "UIView+extend.h"

@implementation Hoge
- (id)init
{
 if (self = [super init]) {
  UIView *aView = [[[UIView alloc] init] autorelease];
  [aView setX:100];
 }
 return self;
}

@end
 
実績の無いソースコードなのでコピペじゃコンパイル通らないかもしれません。
このエントリーをはてなブックマークに追加

2012年2月17日金曜日

tabBarControllerに配置したnavigatioController内でviewControllerをpushした際にタブバーを非表示

タブターコントローラー(UITabBarController)に配置したナビゲーションコントローラー(UINavigatioController)内でviewControllerをpushした際にタブバー(tabbar)を非表示にするにはviewControllerのinitに下記コードを記述します。
-(id)init
{
 if( self=[super init] ){
  self.hidesBottomBarWhenPushed = YES;
 
 }
 return self;
}
 
ナビゲーションバー見たいにいつでも表示/非表示できないん?
このエントリーをはてなブックマークに追加

2012年2月16日木曜日

iOS5でwent isFinished=YES without being started by the queue it is inの対処

iOS5以前はNSOperationをキャンセルする為にcancelメソッド内でisFinishedYESを設定すればよかったのですが、iOS5になってから「went isFinished=YES without being started by the queue it is in」っていうlogがコンソールに表示されるようになってしまいました。
どうやら
「実行されてないのに終了しちゃだめね♥」
といっているようです。これを回避する為に実装を下記のように修正しました。
 
[self setValue:[NSNumber numberWithBool:YES] forKey:@"isFinished"];
 
 
[self setValue:[NSNumber numberWithBool:YES] forKey:@"isExecuting"];
[self setValue:[NSNumber numberWithBool:NO] forKey:@"isExecuting"];
[self setValue:[NSNumber numberWithBool:YES] forKey:@"isFinished"];
 
これがあるべき姿かどうかはわかりませんが、キャンセルしてもlogに「went isFinished=YES without being started by the queue it is in」は表示されなくなれました。
めでたし、めでたし。。。なのか?
このエントリーをはてなブックマークに追加