投稿者のアーカイブ

Xcodeで画像の回転を実装する

Xcodeで画像を回転させるためには、UIGestureRecognizerのひとつであるUIRotationGestureRecognizerを使用します。

viewDidLoadで、回転させたいUIViewにUIRotationGestureRecognizerを設定します。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    //rotation recognizer設定
    UIRotationGestureRecognizer *rotationGestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationView:)];
    [_imageView addGestureRecognizer:rotationGestureRecognizer];
}

ローテーションジェスチャーを行った場合に呼び出されるactionを@selectorで設定します。
今回はrotationViewという名前にしました。

-(void)rotationView:(UIRotationGestureRecognizer *)sender
{
    //回転角度を取得
    CGFloat angle;
    angle = [sender rotation];

    //アフィン変換を適用
    CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
    _imageView.transform = transform;
}

UIRotationGestureRecognizerで取得した角度を_imageViewに反映させます。

参考サイト
2011-09-26 [XCODE]ローテーションジェスチャーを簡単に実装する

iPhoneの画面サイズにあわせて複数のストーリーボードを使い分けたい

XcodeでiPhoneの開発を行っていると、iPhone4S以下とiPhone5以上とで

異なる画面サイズに対応する必要が出てきます。

(iPhone6、iPhone6 Plusについては改めて記事にします)

iPhone4Sの3.5インチとiPhone5以降の4インチの異なる画面サイズに

どう対応するかですが、それぞれの画面サイズ用のストーリーボードを

用意して、画面サイズにあわせて切り替えて表示させる方法を紹介します。

まず、メインの画面サイズを4インチとします。

ストーリーボードを新規作成します。

FileメニューからNew→Fileと進んで、「User Interface」を選択します。

「Storyboard」があるので、「Next」をクリック、適当な名前を付けて作成します。

例えば「Main_iPhone_3_5.storyboard」等と名前を付けます。

ストーリーボードを新規作成したら、AppDelegate.mの

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

内に以下のように記載します。

//画面サイズによってStoryboardを切り替える
UIStoryboard *storyboard;
NSString *storyBoardName;
    
//Windowsスクリーンのサイズを取得
CGRect screen = [[UIScreen mainScreen] bounds];
//縦の長さが480の場合、古いiPhoneだと判定
if (screen.size.height == 480) {
    storyBoardName = @"Main_iPhone_3_5";
} else {
    storyBoardName = @"Main";
}
//StoryBoardのインスタンス化
storyboard = [UIStoryboard storyboardWithName:storyBoardName bundle:nil];
//画面の生成
UIViewController *mainViewController = [storyboard instantiateInitialViewController];
//ルートウィンドウにひっつける
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = mainViewController;
[self.window makeKeyAndVisible];

CakePHPでデータベースの接続を切り替える方法

WEBシステムを開発していると、違うデータベースを

読みたいということがあると思います。

事前準備として、データベース接続情報を

Config/database.php に設定しておきます。

var $default = array(
  'driver' => 'mysql',
  'persistent' => false,
  'host' => 'localhost',
  'login' => 'hogeid',
  'password' => 'hogepass',
  'database' => 'hogedb',
  'encoding' => 'utf8',
  'prefix' => '',
);

var $puyo = array(
  'driver' => 'mysql',
  'persistent' => false,
  'host' => 'localhost',
  'login' => 'puyoid',
  'password' => 'puyopass',
  'database' => 'puyodb',
  'encoding' => 'utf8',
  'prefix' => '',
);

特に設定していない場合は「$default」で設定したDBを読み込みます。

コントローラーで切り替えを行う場合は、以下のようにします。

$this->Model->setDataSource('puyo');

特定の処理のみで取得したい場合は、find等データベース処理の直前に書きます。

処理が終わった後、元に戻したい場合は以下を書きます。

$this->Model->setDataSource('default');

今回はコントローラー全体で使用したかったので、beforeFilter内に書きました。

function beforeFilter() {
  parent::beforeFilter();
  $this->User->setDataSource('puyo');
}

(puyoデータベースをUserモデルで読む場合)

このような場合は、モデルに設定する方法もアリです。

class User extends AppModel{
  var $useDbConfig = 'puyo';
}

参考サイト
CakePHPで複数のデータベースを扱う方法と切り替え ITかあさん

CakePHPでログアウト処理を呼び出したい

CakePHPでAuthコンポーネントを利用してログイン管理をしていて

退会処理を行った場合の実装で、コントローラーから

ログイン処理を呼び出したいということがあったのでメモ。

想像通り、簡単でした。

$this->Auth->logout();

を実行するだけでした。

退会しても、ユーザー情報は物理削除したくないので

usersテーブルに削除フラグを設定しておき、

「退会」のタイミングでこれを「2」に更新します。

退会用のページを作成し、退会理由を尋ねるための質問を用意します。

質問に回答してもらい、退会処理を実行します。

その退会処理の実装です。

$this->request->data['Entrepreneur']['delete_flg'] = '2';
if ($this->Entrepreneur->save($this->request->data, array('validate'=>false))) {
  $this->Auth->logout();
  return $this->redirect(array('action' => 'cancel_comp'));
} else {
  $this->Session->setFlash(__('退会処理に失敗しました。再度お試しください。'));
}

削除フラグを「2」に更新した後、ログアウト処理を実行し

退会完了画面に飛ばします。

ログアウトした状態になるので、

cancel_compはログインしていなくてもアクセスできるようにしておきます。

function beforeFilter() {
  parent::beforeFilter();
  $this->Auth->allow('cancel_comp');
}

CakePHPのradioボタンで、選択肢の後ろにbrタグを入れて改行させたい

CakePHPのradioボタンで、選択肢が長い場合等、

brタグを後ろに入れて改行したいことがあるかと思います。

そんな場合は、separatorを使用します。

<?php
$calcel_flg_arr = array("1"=>"機能が使いづらい、分かりづらい", "2"=>"参考にならなかった", "3"=>"使わなくなった", "4"=>"運営方針に不満があった", "5"=>"その他");
echo $this->Form->input('cancel_flg', array("type"=>"radio", "options"=>$calcel_flg_arr, 'separator' =>'<br />'));
?>

以下のようなHTMLを吐き出してくれます。

<input type="hidden" name="data[Entrepreneur][cancel_flg]" id="EntrepreneurCancelFlg_" value=""/>
<input type="radio" name="data[Entrepreneur][cancel_flg]" id="EntrepreneurCancelFlg" value="1" />機能が使いづらい、分かりづらい<br />
<input type="radio" name="data[Entrepreneur][cancel_flg]" id="EntrepreneurCancelFlg1" value="2" />参考にならなかった<br />
<input type="radio" name="data[Entrepreneur][cancel_flg]" id="EntrepreneurCancelFlg2" value="3" />使わなくなった<br />
<input type="radio" name="data[Entrepreneur][cancel_flg]" id="EntrepreneurCancelFlg3" value="4" />運営方針に不満があった<br />
<input type="radio" name="data[Entrepreneur][cancel_flg]" id="EntrepreneurCancelFlg4" value="5" />その他

CakePHPのページャーでnumbersメソッドを色々カスタマイズしたい

CakePHPで、データの一覧画面を作成する際に

Paginatorを利用すると非常に便利です。

bakeでビューファイルを生成すると、

以下のようなタグが生成されます。

<p>
<?php
echo $this->Paginator->counter(array(
'format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}')
));
?>
</p>
<div class="paging">
<?php
  echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled'));
  echo $this->Paginator->numbers(array('separator' => ''));
  echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next disabled'));
?>
</div>

前半分は、全○ページの○ページ目、全○件のうち○件表示・・・というような情報を表示します。

それぞれ、以下の情報を表示します。

{:page} 現在のページ
{:pages} 全ページ数
{:current} 表示件数
{:count} 全レコード数
{:start} 表示開始レコード番号
{:end} 表示終了レコード番号

後半の

<div class="paging">
~
</div>

の部分が

ページャーを表示する部分です。

デザイナーさんにサイトデザインをお願いした場合、

ページャーをカッコよく仕上げてくれることが結構あります。

カッコいい分、Paginatorを使って実装し辛かったりします。

今回はテーブルタグを使ったHTMLの対応を行ったので、対応方法をメモ。

<table class="page_n">
<tr>
<td class="arrow">&lt;</td>
<td><a href="#">1</a></td>
<td><a href="#">2</a></td>
<td><a href="#">3</a></td>
<td><a href="#">4</a></td>
<td class="active"><a href="#">5</a></td>
<td class="arrow"><a href="#">&gt;</a></td>
</tr>
</table>

(CSSは省略します)

「前へ」の

<td class="arrow">&lt;</td>


「次へ」の

<td class="arrow"><a href="#">&gt;</a></td>

以下のように実装しました。

■前へ
<td class="arrow"><?php echo $this->Paginator->prev(__('<'), array(), null, array('class' => 'arrow disabled')); ?></td>

■次へ
<td class="arrow"><?php echo $this->Paginator->next(__('>'), array(), null, array('class' => 'arrow disabled')); ?></td>

数字部分は以下のようにしました。

<?php echo $this->Paginator->numbers(array('separator' => '', 'tag'=>'td', 'currentClass'=>'active', 'modulus'=>10, 'first' => '先頭へ', 'last'=>'末尾へ')); ?>

separatorで、区切り文字を指定します。

tagで、数字を囲むタグを指定できます。今回の場合はtdタグで囲みます。

currentClassで、現在ページの場合のclassを指定できます。

現在ページの色等を変えたい場合に利用できます。

modulusで、表示するページ番号の数を指定できます。

first、lastは、先頭ページに戻る、末尾ページに移動する際に利用できます。

全ページ数がmodulusで指定したページ数を超える場合に表示されます。

前へ、次へのリンクでも、tagにtdを指定して実装したかったのですが、

リンクがある場合に指定したタグを表示してくれなかったので

上記のようにtagの指定は行わず、tdタグで囲みました。

以下のサイトを参考にさせて頂きました。
ページネーションを利用する CakePHP2.1初心者メモ

CakePHPで、ラジオボタン、セレクトボックスを使用する

CakePHPで選択肢を選んでもらう項目で、

ラジオボタン、セレクトボックスを表示する方法です。

まずはラジオボタンです。


"購読する", "2"=>"購読しない"); ?>
Form->input('mailmag', array("type"=>"radio", "options"=>$options)); ?>

セレクトボックスは以下のようにします。


"購読する", "2"=>"購読しない"); ?>
Form->input('mailmag', array("type"=>"select", "options"=>$options, "empty"=>"選択してください")); ?>

CakePHPのコントローラーでエラーチェックを行う

CakePHPで、確認画面を実装したいなどで

コントローラーにエラーチェックを実装したいということがあるかと思います。

$this->Model->validates() でエラーチェックを行うことが可能です。

注意したいのは、validatesを呼び出す前にModelにデータをsetすることです。

以下のようにします。


$this->Model->set( $this->request->data );
if ($this->Model->validates()) {
//エラーなしの場合
} else {
//エラーありの場合
}

さらに、特定の項目のみエラーチェックを行うことが可能です。

validates()に配列で項目名を渡してやります。


$this->Model->set( $this->request->data );
if ($this->Model->validates( array('name', 'tel') )) {
//エラーなしの場合
} else {
//エラーありの場合
}

これでname, telのバリデーションが行われます。

saveの時にバリデーションを行わないようにもできます。


if ($this->Model->save( $this->request->data, array( 'validate' => false))) {
// エラーなしの場合
}

CakePHPで独自の定数を設定する方法

CakePHPで、システム内のどこからでも利用できる

独自の定数を設定する方法です。

■手順1

app/Config/bootstrap.phpを開いて、以下の1行を追加します。


config('const');

これで、app/Config/const.phpファイルで、定数を設定できるようになります。

■手順2

app/Config/const.phpファイルを作成し、必要な定数を設定します。


define('TEISU','100');
?>

これで、TEISU = 100をシステム内のどこでも使用できます。

CakePHPで日付選択のセレクトボックスを「年月日」表示にしたい

CakePHPで日付選択のセレクトボックスを「年月日」表示にしたい

ということがあって調べたのでメモ。

CakePHP1.2用のものは見つかったのですが、

CakePHP2用のものが見つからなかったので、

以下の記事を参考にちょっと変更を加えました。

CakePHP1.2 HTMLヘルパーの日付コンボを年月日で表示する

コントローラーに以下を追加(1.2と同じ対応)。


$attr = array(
'minYear' => 2000,
'maxYear' => date('Y'),
'separator' => array('年', '月', '日'),
'monthNames' => false
);
$this->set('attr', $attr);
?>

lib/Cake/View/Helper/FormHelper.phpをapp/View/Helpler/にコピーして開きます。

public function dateTime内の以下の箇所を変更します。


$opt = implode($separator, $selects);

の1行を以下に置き換えます。

$opt = "";
$i = 0;
if (is_array($separator)) {
foreach($selects as $select) {
$opt .= $select.$separator[$i];
$i++;
}
} else {
$opt = implode($separator, $selects);
}

(これも変更内容は1.2と同じ)

ビューファイルに以下のように書きます。


echo $this->Form->dateTime('foo_date', 'YMD', 'NONE', $attr);