信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

LIST OF ARTICLES

記事一覧

  • テクログ

    Objective-C | UIDatePicker を下からニュッと出す

    先日、新規アプリが無事リリースされました 消費税相互変換電卓 一発消費ゼータくんです。 ↓ 詳しくは画像をクリックしてね! Mac,iPhone,Objective-C 全て利用歴6ヶ月の新米プログラマーが送る 自分が使って役立ったmethod&Tips集 シリーズ第30弾です。 利用歴6ヶ月でこんなに書けました。やったね! その前にお約束の表示ですよ。 参考場所はありますが単なるコピペを紹介してるわけではありません。 ちゃんと自前で作ってます。(謎のアピール) Objective-Cのコーディングでビックリしたことの一つに日付項目を入力するのにPickerが自動で表示もされなければ、引っ込みもしないです。 Appleさんは、あのでかいPickerを入力画面に貼れとおっしゃる。 どうにか引っ込ませたいと調べたのがコチラ。 ■田村倉庫iOS – UIPickerViewを下から動的に表示する方法 これを改造してUIDatePickerをの表示/非表示を行います。 DatePickerの方が機能が多いので苦労しましたが、delegateや表示の方法はそのまま使えたので助かりました。 部品の配置は以下の画像を参照 UIDatePickerがおいてあるフォームにはSegueで接続してません 代わりにStoryBoardIDを利用して呼び出します。 こうすることで、別の画面からも簡単に呼び出すことが可能になります。 文字列を日付に変換する箇所は第一回のプログラムを使ってます 日付を文字列に変換する箇所も同様に以前の記事を参照願います。 スゴイ伏線回収能力! 動作としては、change dateボタンを押すとDatePickerが現れて、日付を選択後、どこかを押すと、 日付が前の画面に入力される。DatePicker以外は裏の情報が透けて見えるようにしてます 画像ではわかりやすいように、ボタンに色を付けて透過率を下げています UIDatePickerは透けないようにしているので、非透過確認用ラベルが透けて見えないことに注目してください。 特定の部品だけ透過させるのは。 Objective-C | Push遷移とModal遷移を混在させて、さらに前の画面を透過させるで使ってる技を応用してます。 すばらしいっ! common.h につきましてはそれぞれのリンクからソースを持ってきてください。 ファイルの追加方法は新規クラスを選択してSubclass of ではNSObjectを指定します。 ViewController.h #import  #import "DatePickerViewController.h" @interface ViewController : UIViewController // datepicker ------------------- // 「選択」ボタン // 呼び出すPickerViewControllerのポインタ ※strongを指定してポインタを掴んでおかないと解放されてしまう @property (strong, nonatomic) DatePickerViewController *datePickerViewController; // 「選択」ボタンがタップされたときに呼び出されるメソッド - (IBAction)openStDatePickerView:(id)sender; @property (weak, nonatomic) IBOutlet UILabel *dateLabel; ViewController.m #import "ViewController.h" #import "common.h" @interface ViewController (){     NSDate *stDate_;  // 内部保持日時 } @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } #pragma mark - - (IBAction)openStDatePickerView:(id)sender {          [self openDatePickerView:sender]; } // 「選択」ボタンがタップされたときに呼び出されるメソッド - (void)openDatePickerView:(id)sender {     // keyboard hide     [self.view endEditing:YES];          // DatePickerViewControllerのインスタンスをStoryboardから取得し     self.datePickerViewController = [[self storyboard] instantiateViewControllerWithIdentifier:@"DatePickerViewController"];     // 日付の表示モードを変更する(時分を表示)     //    self.datePickerViewController.datePickerMode_ = UIDatePickerModeDateAndTime;     //年月日の切り分け     //if (_daySwitch.on == YES) {         self.datePickerViewController.datePickerMode = UIDatePickerModeDate;          // 日付表示     //} else {     //    self.datePickerViewController.datePickerMode = UIDatePickerModeDateAndTime; // 日付時間表示     //}     // date picker 表示範囲     self.datePickerViewController.minDate = [common stringToDate:@"2010-03-01"]; // min     self.datePickerViewController.maxDate = [common stringToDate:@"2020-08-31"]; // max          // 表示する初期日付     self.datePickerViewController.iniDate = [NSDate date];               self.datePickerViewController.delegate = self;          // DatePickerViewをサブビューとして表示する     // 表示するときはアニメーションをつけて下から上にゆっくり表示させる          // アニメーション完了時のDatePickerViewの位置を計算     UIView *datePickerView = self.datePickerViewController.view;     CGPoint middleCenter = datePickerView.center;          // アニメーション開始時のDatePickerViewの位置を計算     UIWindow* mainWindow = (([UIApplication sharedApplication].delegate).window);     CGSize offSize = [UIScreen mainScreen].bounds.size;          CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, offSize.height * 1.5);     datePickerView.center = offScreenCenter;          [mainWindow addSubview:datePickerView];          // アニメーションを使ってDatePickerViewをアニメーション完了時の位置に表示されるようにする     [UIView beginAnimations:nil context:nil];     [UIView setAnimationDuration:0.3];     datePickerView.center = middleCenter;// 終了位置     [UIView commitAnimations]; } #pragma mark date picker // PickerViewのある行が選択されたときに呼び出されるDatePickerViewControllerDelegateプロトコルのデリゲートメソッド - (void)applySelectedString:(NSDate *)date {     NSString *strDate;     //    if (_daySwitch.on == YES) {     //        strDate = [common dateToString:date formatString:@"MM月dd日(EEE)"];     //    } else {     strDate = [common dateToString:date formatString:@"MM月dd日(EEE)\n HH:mm"];     //    }          stDate_ = date;     _dateLabel.text = strDate;      } // datePickerViewController上にある透明ボタンがタップされたときに呼び出されるPickerViewControllerDelegateプロトコルのデリゲートメソッド - (void)closePickerView:(DatePickerViewController *)controller {     // PickerViewをアニメーションを使ってゆっくり非表示にする     UIView *pickerView = controller.view;          // アニメーション完了時のPickerViewの位置を計算     CGSize offSize = [UIScreen mainScreen].bounds.size;     CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, offSize.height * 1.5);          [UIView beginAnimations:nil context:(void *)pickerView];     [UIView setAnimationDuration:0.3];     [UIView setAnimationDelegate:self];     // アニメーション終了時に呼び出す処理を設定     [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];     pickerView.center = offScreenCenter;     [UIView commitAnimations];      } // 単位のPickerViewを閉じるアニメーションが終了したときに呼び出されるメソッド - (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {     // PickerViewをサブビューから削除     UIView *pickerView = (__bridge UIView *)context;     [pickerView removeFromSuperview]; } @end DatePickerViewController.h #import  @protocol DatePickerViewControllerDelegate; @interface DatePickerViewController : UIViewController @property (weak, nonatomic) IBOutlet UIDatePicker *datePicker; // 空の領域にある透明なボタン @property (weak, nonatomic) IBOutlet UIButton *closeButton; // 処理のデリゲート先の参照 @property (weak, nonatomic) id delegate; // PickerViewを閉じる処理を行うメソッド。closeButtonが押下されたときに呼び出される - (IBAction)closePickerView:(id)sender; @property (nonatomic, assign) int datePickerMode; @property (nonatomic, retain) NSString *pickerName; @property (nonatomic, retain) NSDate *minDate; @property (nonatomic, retain) NSDate *maxDate; @property (nonatomic, retain) NSDate *iniDate; // 初期値 @end @protocol DatePickerViewControllerDelegate  // 選択された文字列を適用するためのデリゲートメソッド //-(void)applySelectedString:(NSString *)str; -(void)applySelectedString:(NSDate *)str; // 当該PickerViewを閉じるためのデリゲートメソッド -(void)closePickerView:(DatePickerViewController *)controller; @end DatePickerViewController.m #import "DatePickerViewController.h" @interface DatePickerViewController () @end @implementation DatePickerViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];     if (self) {         // Custom initialization     }     return self; } - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view.          //    NSLog(@"%d",_datePickerMode);     //    NSLog(@"\n%@",_pickerName);     // 日付の表示モードを変更する(時分を表示)     _datePicker.datePickerMode = _datePickerMode;          // 日付ピッカーの値が変更されたときに呼ばれるメソッドを設定     [_datePicker addTarget:self                     action:@selector(datePickerValueChanged:)           forControlEvents:UIControlEventValueChanged];          [_datePicker setMinimumDate:_minDate];     [_datePicker setMaximumDate:_maxDate];          // 初期値     if (_iniDate != nil) {         [_datePicker setDate:_iniDate];     }          // 背景だけ透過     UIColor *alphaColor = [self.view.backgroundColor colorWithAlphaComponent:0.2]; //透過率     self.view.backgroundColor = alphaColor;     // button だけ透過     UIColor *alphaColor2 = [self.closeButton.backgroundColor colorWithAlphaComponent:0.2]; //透過率     self.closeButton.backgroundColor = alphaColor2;     // UIDatepicker だけ非透過     self.datePicker.backgroundColor = [UIColor colorWithWhite:1.0 alpha:1]; } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } - (NSString *)getFormat{     if (_datePickerMode == UIDatePickerModeDateAndTime) {         return @"yyyy/MM/dd HH:mm";     } else {         return @"yyyy/MM/dd";     } } /**  * 日付ピッカーの値が変更されたとき  */ - (void)datePickerValueChanged:(id)sender {     // デリゲート先の処理を呼び出し、選択された文字列を親Viewに表示させる     //[self.delegate applySelectedString:_datePicker.date]; } // 空の領域にある透明なボタンがタップされたときに呼び出されるメソッド - (IBAction)closePickerView:(id)sender {     // デリゲート先の処理を呼び出し、選択された文字列を親Viewに表示させる     [self.delegate applySelectedString:_datePicker.date];          // datePickerを閉じるための処理を呼び出す     [self.delegate closePickerView:self];      } @end ViewController.mの中で_daySwitch をUISwitchを使ってトグル表示していたのですが今回の説明では複雑になるのでコメント化しております UISwitch を最初の画面に貼ってViewController.mに接続するか、_daySwitchをただの変数にしてあげると、日付+時間モードにも対応しているのがわかると思います。 DatePickerViewControllerはdatePickerModeを判別して表示を切り替えているので修正は必要ありません できあがり図、DatePickerだけ透過して無くて後ろの画面が透けてます。 日付を選択して、DatePicker意外とタップするとラベルに日付が入ります。 こんな基本の部品がどこにも出回ってないので他の皆様のお役に立てればと思います。   そのほかのObjective-C関連の記事をお探しならコチラをどうぞ   弊社から出している拙作スケジュールのアプリです。 スケジュールというかちょっとした予定を入力して、社長、同僚、家族がどこ行った??っていうときに第三者が確認するためのアプリです 是非ダウンロードして感想をお聞かせ下さい。 『Team Scheduler』 概要 ▼アプリ価格: 無料 ▼対応OS: iOS(iPhone/iPod Touch)、Android ▼カテゴリ: 仕事効率化(App Store)、ビジネス(Google Play) ▼対応言語: 日本語 ▼推奨環境:  iOS版: iPhone4以降、iOS6. 0以降  Android版: Android OS 2. 3以降 ▼ダウンロード:     今回、Objective-Cのテクログも30回で一区切りなので 俺による俺インタビューでもしてみようと思います   俺「Objective-C説明書いてみてどうでしたか?」 俺「とにかく情報が陳腐化してて、大変でした。今のバージョンで使えるんだか使えないんだかも知識が無いからわからないし、見つかるページのほとんどが英語だし。でも、後から見た人がコピペでパッと使えればいいかと思ってがんばって書きました。」   俺「正直30個も書けると最初から思ってましたか?。」 俺「最初は説明するなんて無理だと思ってましたが、12個すぎた当たりから調子が出てきました。もうちょっと書けそうですし、これからも書くことはあると思います。が、半年でこんなにネタが出来るなんてObjective-C恐るべしですね。」   俺「ちょっとはObjective-C使えるようになったと思ったらSwift出てきちゃいましたがどうですか?」 俺「iOS8-9までは間違いなくObjective-Cと併用出来ると思います、使えなくなるとアナウンスがあってから考えればいいんじゃ無いですかね?使ってる側にしたら何で作られて様がバグ無くさくさく動けばいいと思うんで。でもドキュメント斜め読みしてぱっと見、昔のVBっぽかったので実際やるにしても取っつきやすそうです。」   俺「まだまだ、お話はつきませんが、最後に一言お願いします」 俺「日本語画像付きで一生懸命解説してくださってるサイト運営の皆様方、ありがとうございます。お陰で何とかアプリ2本作れるところまで来ました。今後出来ればもっちょっと突っ込んだ記事があると助かりますw超細かいところはStackOverflowだのみだったので。StackOverflowが無ければ即死でした。記事読んでる方、アプリを使われてる方、ありがとうございます。」 俺「ありがとうございました。」
  • テクログ

    Objective-C | UICollectionViewを使ったCellの追加とスクロール

    先日、新規アプリが無事リリースされました 消費税相互変換電卓 一発消費ゼータくんです。 ↓ 詳しくは画像をクリックしてね! Mac,iPhone,Objective-C 全て利用歴6ヶ月の新米プログラマーが送る 自分が使って役立ったmethod&Tips集 シリーズ第29弾です。 その前にお約束の表示ですよ。 参考場所はありますが単なるコピペを紹介してるわけではありません。 ちゃんと自前で作ってます。(謎のアピール) UICollectionView はiOS6から追加された比較的新しい部品です。 検索してもあまり日本語の資料がありませんが、調べてみるとUITableViewとほとんど変わりません。 すぐ忘れちゃうので、追加した行に移動する処理もおまけして記事を書きます。 StoryBoard上で以下を設置。 UICollectionViewCellのプロパティ設定 Delegateの設定をします ViewController.h #import  @interface ViewController : UIViewController @end ボタンを押下するとUICollectionViewCellが増えます ViewController.m #import "ViewController.h" @interface ViewController (){     int rowCount; } @property (weak, nonatomic) IBOutlet UICollectionView *myCollectionView; - (IBAction)addBtn:(id)sender; @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.     _myCollectionView.dataSource = self;     _myCollectionView.delegate = self;     rowCount = 1; } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { //    return [sectionList_ count];     return 1; } // 各セクションの項目数 -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {     return rowCount; } -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{          UICollectionViewCell *cell = nil;     cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell0" forIndexPath:indexPath];          UILabel *userName = (UILabel *)[cell viewWithTag:1];     userName.text = [NSString stringWithFormat:@"label-%d", indexPath.row];          // 行のスクロール     [_myCollectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES];     return cell; } - (IBAction)addBtn:(id)sender {     // ボタン押下でCellを増やす     rowCount++;     [_myCollectionView reloadData];      } @end 今回セクションは表示してない&増加させてませんが、配列を駆使すればUITableViewと同じく動的に増やすことも可能です。   そのほかのObjective-C関連の記事をお探しならコチラをどうぞ   弊社から出している拙作スケジュールのアプリです。 スケジュールというかちょっとした予定を入力して、社長、同僚、家族がどこ行った??っていうときに第三者が確認するためのアプリです 是非ダウンロードして感想をお聞かせ下さい。 『Team Scheduler』 概要 ▼アプリ価格: 無料 ▼対応OS: iOS(iPhone/iPod Touch)、Android ▼カテゴリ: 仕事効率化(App Store)、ビジネス(Google Play) ▼対応言語: 日本語 ▼推奨環境:  iOS版: iPhone4以降、iOS6. 0以降  Android版: Android OS 2. 3以降 ▼ダウンロード:    
  • テクログ

    Xcode 5 | 指定された色を画像から取り込む

    先日、新規アプリが無事リリースされました 消費税相互変換電卓 一発消費ゼータくんです。 ↓ 詳しくは画像をクリックしてね! Mac,iPhone,Objective-C 全て利用歴6ヶ月の新米プログラマーが送る 自分が使って役立ったmethod&Tips集 シリーズ第27弾です。 弊社ではアプリのコーディング担当と画面デザイン担当が異なります。 画面の参考画像で色指定されます。 コード教えて貰ってぽちぽち入力するのですが、XCODEの色指定は一般にHTMLで記述する16進方式(#666FFF みたいなの)では無く RGBで指定します。 毎回変換しながら色指定してたのですが、先日画像から色を抜き出す方法を発見! どれでもいいからプロパティからカラーパレットを呼び出します。 Palette と表示されているところ箇所でNew from File ...を選択 任意のファイルを取り込むと 指定した画像が表示されるので、スポイト替わりに色を指定することが可能となります どういうわけか指定した色コードと、シミュレーター/実機で確認する色が一致しないので Finderにあるアプリケーション→DigitalColor Meter.appを起動して指定画像とエミュレータで表示されたの色の差分を取って Xcode のカラープロパティでシミュレーションで表示した色との差を埋めていけば指定された画像と同じ色のできあがり   そのほかのObjective-C関連の記事をお探しならコチラをどうぞ   弊社から出している拙作スケジュールのアプリです。 スケジュールというかちょっとした予定を入力して、社長、同僚、家族がどこ行った??っていうときに第三者が確認するためのアプリです 是非ダウンロードして感想をお聞かせ下さい。 『Team Scheduler』 概要 ▼アプリ価格: 無料 ▼対応OS: iOS(iPhone/iPod Touch)、Android ▼カテゴリ: 仕事効率化(App Store)、ビジネス(Google Play) ▼対応言語: 日本語 ▼推奨環境:  iOS版: iPhone4以降、iOS6. 0以降  Android版: Android OS 2. 3以降 ▼ダウンロード:    
  • テクログ

    Objective-C | 超簡単!画像をアニメーションさせて音を出す

    先日、新規アプリが無事リリースされました 消費税相互変換電卓 一発消費ゼータくんです。 ↓ 詳しくは画像をクリックしてね! Mac,iPhone,Objective-C 全て利用歴6ヶ月の新米プログラマーが送る 自分が使って役立ったmethod&Tips集 シリーズ第26弾です。 参考場所はありますが単なるコピペを紹介してるわけではありません。 ちゃんと自前で作ってます。(謎のアピール) 今回は没になったアイディア、画像が動いて音が鳴る様にする方法です Targets の Linked Frameworks and Librariesに (プロジェクト名をクリックしてGeneral 表示のやつですね) AudioToolbox.framework QuartzCore.framework をとりこみます。 ViewController.h  #import  #import  #import  @interface ViewController : UIViewController @end いつも思うけど#import行はどっちに書くのが正解なんすかね? ViewController.m  #import "ViewController.h" @interface ViewController () {     SystemSoundID soundID;     SystemSoundID soundID2; } - (IBAction)soundButton:(id)sender; @property (weak, nonatomic) IBOutlet UIImageView *imgTest; @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.     NSString *path = [[NSBundle mainBundle] pathForResource:@"test-sound" ofType:@"wav"];     NSURL *url = [NSURL fileURLWithPath:path];     AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &soundID;);      } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } - (IBAction)soundButton:(id)sender {          /* 回転 */     CABasicAnimation *aniRoll =     [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];          aniRoll.toValue = [NSNumber numberWithFloat:2 * 1 * M_PI]; // 終了時の角度  // 1回転     // 回転角度を設定     aniRoll.fromValue = [NSNumber numberWithFloat:0.0]; // 開始時の角度     aniRoll.toValue = [NSNumber numberWithFloat:4 * M_PI]; // 終了時の角度-          /* グループ */     CAAnimationGroup *group = [CAAnimationGroup animation];     group.delegate = self;     group.duration = 5.0;     group.repeatCount = 1;          // アニメーションを追加     //    group.animations = [NSArray arrayWithObjects:animation1, animation2, nil];     group.animations = [NSArray arrayWithObjects:aniRoll, nil];     [_imgTest.layer addAnimation:group forKey:@"move-rotate-layer"];          AudioServicesPlaySystemSound(soundID); } CAAnimationGroup は他の効果もたくさんあるので参考サイトをご覧ください ■逆引きObjective-C for iPhoneアプリ CABasicAnimationの基本的な使い方(移動・回転・拡大・縮小)   そのほかのObjective-C関連の記事をお探しならコチラをどうぞ   弊社から出している拙作スケジュールのアプリです。 スケジュールというかちょっとした予定を入力して、社長、同僚、家族がどこ行った??っていうときに第三者が確認するためのアプリです 是非ダウンロードして感想をお聞かせ下さい。 『Team Scheduler』 概要 ▼アプリ価格: 無料 ▼対応OS: iOS(iPhone/iPod Touch)、Android ▼カテゴリ: 仕事効率化(App Store)、ビジネス(Google Play) ▼対応言語: 日本語 ▼推奨環境:  iOS版: iPhone4以降、iOS6. 0以降  Android版: Android OS 2. 3以降 ▼ダウンロード:    
  • テクログ

    Objective-C | Push遷移とModal遷移を混在させて、さらに前の画面を透過させる

    先日、新規アプリが無事リリースされました 消費税相互変換電卓 一発消費ゼータくんです。 ↓ 詳しくは画像をクリックしてね! Mac,iPhone,Objective-C 全て利用歴6ヶ月の新米プログラマーが送る 自分が使って役立ったmethod&Tips集 シリーズ第25弾です。 参考場所はありますが単なるコピペを紹介してるわけではありません。 ちゃんと自前で作ってます。(謎のアピール) さて今回は大物です。 Navigation Controllerで接続された画面は普通にやるとPush遷移とModal遷移は混在出来ません。 しかしコードから呼ぶことによりモーダル画面に遷移が可能です。 ただコード書いただけだと画面がパッと出てきてしまい違和感バリバリです、画面表示時にアニメーション効果を追加してます。 何故こんな面倒なことをするかというと、画面を透過させる効果を利用したかったからです。 今回は準備が大変です。 1.Single View Applicateionで新たにProjectを作成。 2.UINavigationControllerをStoryBoard上にドラッグ。 3.青枠で囲われたTableViewをDel。 4.残ったNavigation Controller をcontrol押しながら元からあるViewに接続、そして接続方法はroot viewを選ぶ。 5.UIViewControllerをStoryBoard上にドラッグ。 6.それぞれの画面にボタン配置。 7.色を変える最初の画面と次の画面はsegueで接続しません。 8.File→New→FileObjective-C classを選んでNextボタン Class:NextViewController  Subclass of:UIViewController。 9.segueで接続しなかった画面のプロパティを設定。 ここで設定したStoryBoardIDを画面呼び出しに利用します。 準備おわり。ソースが用意出来ればこんな面倒なこと書かなくていいんですけどねぇ。 ViewController.h は変更ありません 次の画面に遷移する用のボタンと、次の画面の先ほど作成したクラスを呼ぶようにしてます。 ViewController.m #import "ViewController.h" #import "NextViewController.h" @interface ViewController () - (IBAction)nextScreen:(id)sender; @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } - (IBAction)nextScreen:(id)sender {     //modalviewの背景を透明にする     // 画面遷移エフェクトがなくなるので、そこは独自実装 モーダルビューのviewDidAppear:(BOOL)animatedに記述     self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;               // モーダルで表示     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];     // Storyboard ID を指定して画面遷移     NextViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"NextScreen"];     // controllerにNavigationController を新たに付与     UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:controller];     // 画面遷移のアニメーションを設定     nc.modalTransitionStyle = UIModalTransitionStyleCoverVertical;     // UINavigationControllerに向けてモーダルで画面遷移     [self presentViewController:nc animated:NO completion:nil];      } @end NextViewController.h は変更ありません NextViewController.m #import "NextViewController.h" @interface NextViewController () - (IBAction)returnScreen:(id)sender; @end @implementation NextViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];     if (self) {         // Custom initialization     }     return self; } - (void)viewDidLoad {     [super viewDidLoad];     // Do any additional setup after loading the view.     // 背景だけ透過     UIColor *alphaColor = [self.view.backgroundColor colorWithAlphaComponent:0.8]; //透過率     self.view.backgroundColor = alphaColor; } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } -(void)viewDidAppear:(BOOL)animated {     // 半透明効果のせいでアニメーションしないので自前で書く         CGFloat h = [[UIScreen mainScreen] bounds].size.height;         CGFloat w = [[UIScreen mainScreen] bounds].size.width;         [UIView beginAnimations:nil context:nil];         [self.view setFrame:CGRectMake(0, h, w, h)];         [UIView setAnimationDuration:0.3f];         [self.view setFrame:CGRectMake(0, 0, w, h)];         [UIView commitAnimations];      } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {     // Get the new view controller using [segue destinationViewController].     // Pass the selected object to the new view controller. } */ - (IBAction)returnScreen:(id)sender {         [self.presentingViewController dismissViewControllerAnimated:YES completion:^{}]; } @end さらっと書いてますが、viewDidLoadでの記述している方法を使うことで、他の部品は透明になりません。 UIColor *alphaColor = [self.view.backgroundColor colorWithAlphaComponent:0.8]; //透過率 self.view.backgroundColor = alphaColor; プロパティで透過させると他の部品も全部透過します。 前の画面に戻る記述は定型文みたいなモンなので、覚えておけばどこでも使えます。 2画面前に戻るとかはまた違う話ですが。。。   そのほかのObjective-C関連の記事をお探しならコチラをどうぞ   弊社から出している拙作スケジュールのアプリです。 スケジュールというかちょっとした予定を入力して、社長、同僚、家族がどこ行った??っていうときに第三者が確認するためのアプリです 是非ダウンロードして感想をお聞かせ下さい。 『Team Scheduler』 概要 ▼アプリ価格: 無料 ▼対応OS: iOS(iPhone/iPod Touch)、Android ▼カテゴリ: 仕事効率化(App Store)、ビジネス(Google Play) ▼対応言語: 日本語 ▼推奨環境:  iOS版: iPhone4以降、iOS6. 0以降  Android版: Android OS 2. 3以降 ▼ダウンロード:    
  • テクログ

    Objective-C | リアルタイムで入力制限を行う

    先日、新規アプリが無事リリースされました 消費税相互変換電卓 一発消費ゼータくんです。 ↓ 詳しくは画像をクリックしてね! Mac,iPhone,Objective-C 全て利用歴6ヶ月の新米プログラマーが送る 自分が使って役立ったmethod&Tips集 シリーズ第24弾です。 参考場所はありますが単なるコピペを紹介してるわけではありません。 ちゃんと自前で作ってます。(謎のアピール) JavaScriptのように入力した文字を入力と同時に制限してみます。 StoryBoard上にUITextField を配置してください。 ViewController.h #import  @interface ViewController : UIViewController @end サンプルでは、スペースを入力不可にして、15文字以上入れられないようにしてます。 ViewController.m #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.     for (id v in self.view.subviews) {         if([NSStringFromClass([v class]) isEqualToString:@"UITextField"]){             ((UITextField*)v).delegate = self;         }     } } - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning];     // Dispose of any resources that can be recreated. } // 入力文字数を制限する - (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {     //space remove     if (![string compare:@" "]) {         return NO;     }          BOOL isLengthLimit;          // 変更前のtextを取得     NSMutableString *tmp =[textField.text mutableCopy];     // 編集後のtext     [tmp replaceCharactersInRange:range withString:string];          // sjis code 15 文字以下     isLengthLimit = [tmp lengthOfBytesUsingEncoding:NSShiftJISStringEncoding] <=15;     return  isLengthLimit; } @end 今回入力エリアをプロパティ接続してません。 View上のUITextFieldを高速列挙で探してDelegateを設定してます。 全部にセットするときはこの方法の方が、後で追加しても漏れがありませんね。 更に入力制限は、 以前のエラーチェックを利用すると色々幅が広がると思います 回が進むと色々と組み合わせられるので楽になってきますね。   そのほかのObjective-C関連の記事をお探しならコチラをどうぞ   弊社から出している拙作スケジュールのアプリです。 スケジュールというかちょっとした予定を入力して、社長、同僚、家族がどこ行った??っていうときに第三者が確認するためのアプリです 是非ダウンロードして感想をお聞かせ下さい。 『Team Scheduler』 概要 ▼アプリ価格: 無料 ▼対応OS: iOS(iPhone/iPod Touch)、Android ▼カテゴリ: 仕事効率化(App Store)、ビジネス(Google Play) ▼対応言語: 日本語 ▼推奨環境:  iOS版: iPhone4以降、iOS6. 0以降  Android版: Android OS 2. 3以降 ▼ダウンロード: