By Hoshino

0

UIViewを反転させる

UIViewを反転させる方法です。 CGAffineTransformを使えば1行でいけます。 例のごとく対象となるUIViewを用意しましょう。 – (void)viewDidLoad {        [super viewDidLoad];         UIView *view = [UIView new];        view.frame = CGRectMake(0, 0, 200, 200);        view.backgroundColor = [UIColor redColor];        view.center = CGPoinMake(self.view.frame.size.width/2, self.view.frame.size.height/2);        [self.view addSubview:view];         UIImageView *imageView = [UIImageView new];        imageView.image = [UIImage imageNamed:@”apple”];        [view addSubview:imageView];        …} ふむ。 1.左右反転 x軸方向に-1倍拡大してあげるだけです。 view.transform = CGAffineTransformMakeScale(-1, 1); 2.上下反転 y軸方向に-1倍拡大してあげるだけです。 view.transform = CGAffineTransformMakeScale(1, -1); 3.上下左右反転 流れでわかると思いますが、x,y軸方向に-1倍拡大してあげるだけです。 view.transform = CGAffineTransformMakeScale(-1, -1); 簡単ですな。

View More

By Hoshino

0

UIViewの回転、拡大、縮小

iPhoneアプリといえばアニメーションが綺麗です。 どこぞのアンドロイドと違って変にカクカクしないですし、滑らかです。 そしてアニメーションといえば移動、回転、拡大、縮小の組み合わせが多いでしょう。 そんなわけで今回はUIViewをCGAffineTransformとか言うよく分からない奴で移動、回転、拡大、縮小をする方法の基本を学びましょう。 とりあえず対象のViewを用意します。 ほおおおおお…そいやっ – (void)viewDidLoad {        [super viewDidLoad];         UIView *view = [UIView new];        view.frame = CGRectMake(0, 0, 200, 200);        view.backgroundColor = [UIColor blueColor];        view.center = CGPoinMake(self.view.frame.size.width/2, self.view.frame.size.height/2);        [self.view addSubview:view];         UIImageView *imageView = [UIImageView new];        imageView.image = [UIImage imageNamed:@”apple”];        [view addSubview:imageView];        …} いい感じですね。 そして相変わらずこのブログのコードのカラーリングはとっても見やすいです。 1.移動 右に40px、上に50px移動させます。 view.transform = CGAffineTransformMakeTranslation(40, -50); 2.回転 30°右に回転させます。 view.transform = CGAffineTransformMakeRotation(M_PI * 30.0 / 180.0); こんなDefineを用意すればスッキリします。 #define RADIAN(x) (M_PI * (x) / 180.0)…view.transform = CGAffineTransformMakeRotation(RADIAN(30)); 3.拡大と縮小 拡大と縮小です。比率を大きくすれば拡大、小さくすれば縮小出来ます。 view.transform = CGAffineTransformMakeScale(1.5, 1.5); 第1引数がx方向の拡大率、第2引数がy方向の拡大率なので、別の値を入れれば歪ませることも出来ます。 view.transform = CGAffineTransformMakeScale(0.5, 1.2); 4.初期化 真っさらな状態に戻します。つまりデフォルト値です。 view.transform = CGAffineTransformIdentity; 5.組み合わせる 「拡大して回転」みたいにアフィン変換を組み合わせます。 5.1.対象となるCGAffineTransformを指定するパターン アフィン変換をかける対象となるCGAffineTransformを指定するパターンです。 こんな感じ。 view.transform = CGAffineTransformMakeScale(1.2, 1.2);view.transform = CGAffineTransformRotate(view.transform, RADIAN(50));view.transform = CGAffineTransformTranslate(view.transform, -30, 30); 注意する点として、こちらは一見「1.2倍に拡大」⇒「右に50°傾ける」⇒「左に30px、下に30px移動」ってな変換をしてるイメージですが、Makeが付かないCGAffineTransformXXXの関数は第2引数の処理の後、第1引数のCGAffineTransformを掛けるので、 ①「1.2倍に拡大」②「右に50°傾ける」⇒①③「左に30px、下に30px移動」⇒② となり、実際は「左に30px、下に30px移動」⇒「右に50°傾ける」⇒「1.2倍に拡大」という処理になります。 5.2.CGAffineTransformを合成するパターン 複数のCGAffineTransformを合成したものを最後に適用させるパターンです。 CGAffineTransform t1 = CGAffineTransformMakeTranslation(-30, 30);CGAffineTransform t2 […]

View More

By Hoshino

0

YouTubeのURLをJavaScriptで自動で埋め込みプレイヤーにする

極秘で運営している「SHINDAN.in」というものがあります。 名前診断を作成するサイトです。そしてよく考えたら極秘ではなかったです。 ただ名前診断で結果を出すだけじゃ、なんだかありきたりでインパクトがないような気がするので、今日は診断結果にYouTubeのURLを入れると埋め込みプレイヤーに変換するようにJavaScriptで実装したいと思います。 1.難しい話じゃない ぱっと見難しいような気がしますが、そんなことはありません。 要するに… こんなURLを検知して、 こんな風に埋め込みプレイヤーのコードに変換するだけなのです。 <iframe src=”http://www.youtube.com/embed/6CKZgIYJa3o” frameborder=”0″ allowfullscreen></iframe> 2.注意点 YouTubeのリンクは主に2種類あります。 このようにGET値がついた通常のURLと、 YouTubeが提供している短縮URLです。 このどちらにも対応したコードを書きましょう。 3.いざ実装 えいやっ //HTMLデコードする関数var decodeHTML = function(str) {        var decoded = $(“<div/>”).html(str).text();        return decoded;}; //PHPで言うpreg_match_allをやってくれる関数var preg_match_all = function(regex, haystack) {        var globalMatch = haystack.match(regex);        var matchArray = new Array();        for(var i in globalMatch) {                try {                        var nonGlobalRegex = new RegExp(regex);                        var nonGlobalMatch = globalMatch[i].match(nonGlobalRegex);                        matchArray.push(nonGlobalMatch[0]);                } catch(e){}        }        return matchArray;}; //URLからGET値のKeyを指定したら取って来てくれるvar getParameterByName = function(name, url) {        var query_string = url.split(“?”);        if(query_string.length >= 2) {                var params = query_string[1].split(“&”);                var i = 0;                while(i < params.length) {                        var param_item = params[i].split(“=”);                        if(param_item[0] == name) return param_item[1];                        i++;                }                        }        return “”;}; //YouTubeの埋め込みvar youTubeEmbed = function(text) {        var URLs = preg_match_all(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, text);        for(var i = 0; i < URLs.length; i++) {                var url = URLs[i];                if(url.match(/(?:http:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\/)?(.+)/g)) { //YouTubeのリンクかどうか判定                        var youTubeId = getParameterByName(‘v’, decodeHTML(url));                        if(youTubeId == ”) youTubeId = url.replace(/(?:http:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\/)?(.+)/g, ‘$1’);                        youTubeId = (youTubeId.split(‘#’))[0]; //時間指定を消す。(残したい場合はこの処理いらないよっ)                        text = text.replace(url, ‘<iframe src=”http://www.youtube.com/embed/’+youTubeId+’” frameborder=”0″ allowfullscreen></iframe>’);                }        }        return text;}; こんな感じ。 関数名やコメントアウトを見れば意味は分かると思います。 (正規表現についてはじーっと見てればそのうち分かる気がする今日このごろ。) ちゃんと動くかどうか試してみます。 var text = ‘https://www.youtube.com/watch?v=6CKZgIYJa3oというリンクとhttp://youtu.be/6CKZgIYJa3oというリンクです。’;console.log(youTubeEmbed(text)); 結果は <iframe src=”http://www.youtube.com/embed/6CKZgIYJa3o” frameborder=”0″ allowfullscreen></iframe>というリンクと<iframe src=”http://www.youtube.com/embed/6CKZgIYJa3o” frameborder=”0″ allowfullscreen></iframe>というリンクです。 どちらのURLでもちゃんと変換できました。 ばっちぐーです。 4.サイトに乗せる CSSでプレイヤーのサイズを統一したいので<iframe>を<div>要素で囲みました。 そして猫のYouTubed動画を100個集めました。 そんでもって「今日の猫動画」なるものを作成しました。 ⇒ […]

View More

By Hoshino

0

UITableViewとかUICollectionViewとかがズレるとき

暖かいです。もうすっかり春です。だから今日は服を着ないで過ごそうと思います。 さて、iPhoneアプリを作ろうとキーボード(あっきぃの数少ない友だち)を叩いているとこんなエラーが。 the behavior of the UICollectionViewFlowLayout is not defined because: the item height must be less than the height of the UICollectionView minus the section insets top and bottom values. 出ました。英語です。 (誰か早く関西弁でエラーを吐き出すプラグインを作ってください。) どんな意味か知りませんが、 「UICollectionViewのアイテムの高さというか座標というかなんかそんな感じのがUICollectionViewの高さより小さいよ。クズめ。」 みたいなニュアンスだと思います。 状況としては、UINavigationBarが非表示のViewControllerから、UINavigationBarが表示されているViewController遷移する感じのところにUICollectionViewがあるって感じ。 あーこれはUINavigationBarの表示&非表示でScrollView系のInsetsが自動で変更してくれるような機能が備わっているのではないだろうか。そしてあっきぃに生きる資格はほぼ無いのではないだろうか。 との予想の下、調べてみるとこんなプロパティがUIViewControllerあるのでした。 @property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets NS_AVAILABLE_IOS(7_0); // Defaults to YES このautomaticallyAdjustsScrollViewInsetsの値がデフォルトでYESなので、 きっといいタイミングでNOにすればいいのです。 とりあえずインスタンス生成時に変更しておけばいいだろうとそのUIViewControllerにこんな記述を追加。 -(instancetype)init{        self = [super init];        if(self) {                self.automaticallyAdjustsScrollViewInsets = NO;        }        return self;} 結果は… 治った。 ScrollView系がズレるのは他にも色々原因があると思うので、参考の1つとしてお考えくださいまし。 ではでは。

View More

By Hoshino

0

背面が透明な手帳型iPhoneケース「Cellularline Clear Book」

公開: 2015-03-02 01:05更新: 2016-04-29 06:02 大人で素敵なiPhoneケースを扱うブランド「Cellularline(セルラーライン)」から面白い手帳型のiPhoneケースが登場しました。 「Clear Book」という名のiPhoneケース。 ありそうでなかった背面が透明の手帳型iPhoneケースです。 おかげでリンゴマークが生きます。 またカードも入るので、通勤、通学にも生きます。 カラーラインナップはiPhone6/6+のスペースグレイ、ゴールド、シルバーに似合う3色。 iPhoneのデザインを生かしつつ手帳タイプが使いたいあなたにピッタリのケースです。 ⇒ Cellularline iPhone6/iPhone6 Plus ケース 手帳型 CLEAR BOOK for iPhone6(4.7)/iPhone6 Plus(5.5) 【スリムデザイン】(Amazonへ)

View More

By Hoshino

0

iOS8 スクロールするとリサイズイベントが呼ばれるので

こんにちは、あっきぃです。 最近少し暖かくなってきた気がします。 そして北の国からのストーリーがよく分からないです。 さて、iOS8でスクロールすると何故かリサイズイベントが呼ばれてしまいます。 Safariのヘッダーが引っ込んだり、出て来たりした時に呼ばれる仕様になったようです。 作業していたアプリは、リサイズ時にCanavasでゴリゴリ図を描く処理を走らせていたので少し厄介。 そんな訳でこうしました。 var windowWidth = $(window).width();$(window).resize(function(){        var ww = $(window).width();        if(windowWidth != ww) {                 //リサイズ時に実行する処理                 windowWidth = ww;        }}); 横幅が変わった場合に呼ぶようにしました。 これで安心。

View More

By Hoshino

二本足の椅子「Inactivity」 – あぷすた

2本足の椅子「Inactivity」 足りない足は自分の足で補います。 作成したのはフランス生まれのデザイナー「Benoit Malta」 1990年生まれと、意外と若い。 動画もあります。 ⇒ – Inactivité – part I – Benoit Malta

View More

By Hoshino

0

ゼロハリバートンのiPhone6用ケースがカッコいい

高級でカッコいいアルミのスーツケースやアタッシュケースなどでおなじみの 「ZERO HALLIBURTON(ゼロハリバートン)」 そんなアルミに扱いに長けまくってるゼロハリからiPhone6用のケースが出ました。 シンプルですが洗練されたデザインが美しいです。 もちろん頑丈。 ⇒ ZERO HALLIBURTON for iPhone6 Silver iPhone6 ケース(Amazonへ)

View More

By Hoshino

0

Objective-C 指定したディレクトリ以下の全ファイルを表示

こんにちは。 最近なんだかまた生命線が濃くなった気がするあっきぃです。 無駄な動きで生傷ばかり増やしているので、なんか疲れるお仕事ください。よろしくお願いします。 (傷もすぐ治るよ!) さてさて 今日はこんな関数を用意しました。 +(NSArray*)allFilesOfDirectroyAtPath:(NSString*)dirPath{        NSMutableArray *dirs = [NSMutableArray array];        NSMutableArray *files = [NSMutableArray array];        NSFileManager *fileManager = [NSFileManager defaultManager];        NSError *error;        NSArray *list = [fileManager contentsOfDirectoryAtPath:dirPath error:&error;];        for(NSString *name in list) {                NSString *fullPath = [dirPath stringByAppendingPathComponent:name];                BOOL isDir;                if ([fileManager fileExistsAtPath:fullPath isDirectory:&isDir;]) {                        if (isDir) {                                [dirs addObject:fullPath];                        } else {                                [files addObject:fullPath];                        }                }        }        for(NSString *subDirPath in dirs) {                NSArray *subFiles = [self allFilesOfDirectroyAtPath:subDirPath];                [files addObjectsFromArray:subFiles];        }        return files;} 指定したディレクトリ内の全ファイルをフルパスで取得する関数です。 再帰的に呼び出しているのがポイントですね。 使う時はこんな感じ。 NSString *libPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];NSArray *files = [MYClass allFilesOfDirectroyAtPath:libPath];NSLog(@”%@”, files); 結果はこんな感じ (        “/var/mobile/Containers/Data/Application/123CAD20-DEFE-9922-DADE-A12608D099EE/Library/Caches/JMCache/JMImageCache-2802983090”,        “/var/mobile/Containers/Data/Application/123CAD20-DEFE-9922-DADE-A12608D099EE/Library/Caches/JMCache/JMImageCache-3419541678”,        “/var/mobile/Containers/Data/Application/123CAD20-DEFE-9922-DADE-A12608D099EE/Library/Caches/JMCache/JMImageCache-3911839920”,        “/var/mobile/Containers/Data/Application/123CAD20-DEFE-9922-DADE-A12608D099EE/Library/Caches/JMCache/JMImageCache-4019589813”,        …) あるとたまに便利。

View More

By Hoshino

0

PCをiPhoneから遠隔操作できる「Chromeリモートデスクトップ」を試してみた

誰でも簡単にiPhoneで自分のPCを遠隔操作出来るアプリがGoogleから出ました。 その名も「Chromeリモートデスクトップ」 ってなわけでさっそくiPhone→MacBookで試してみましょう。 1.PC側でリモートデスクトップのインストール PCの方の準備をします。 まずはお使いのGoogleChromeにこちらのアドオンを入れます。 ⇒ Chrome リモート デスクトップ(Chromeウェブストアへ) 「無料」をクリック 「追加」をクリック 入りました。 2.PC側でGoogleChromeにログイン GoogleChromeにログインします。 すでにログイン済みの方はこの作業は必要ありません。 メニューから「Chromeにログイン」を選択 IDとパスワードを入力してログイン アカウントがない場合は新規作成してください。 3.PC側準備 GoogleChromeのアプリ一覧(chrome://apps)から「リモートデスクトップ」を選択してください。 ブラウザからPCにアクセス出来るんなんてのにはやっぱり許可が要ります。 安心のGoogleなので許可しましょう。 許可するアカウントを選択 「2.PC側でGoogleChromeにログイン」でログインしたIDです。 (ブラウザにログインする必要ないカモ。) つらつらと何かが書いてあります。 よく読んだ気になって「承認する」をクリック するとこの画面に。 他の人と画面共有する機能もあるみたいですが、 今回は「マイ パソコン」の方の「利用を開始」します。 「リモート接続を有効にする」をクリックしてください。 するとアプリがダウンロードされます。 ダウンロードした「chromeremotedesktop.dmg」をクリック。 こんなのが出てくるのでダブクリ (ダブルクリックのことだよ!) 「Chrome Remote Desktop Host」ってのをインストールするようです。 「続ける」を連打。 インストールしたら、ブラウザに戻ってOKを押すとPINの作成が求められます。 お好きなPINコード(数字6桁以上)を入力し「OK」を押しましょう。 すると先ほどちゃっかりインストールした「Chrome Remote Desktop Host」からPINコードを求められます。 今まさに入力したPINコードを入力してください。遠隔操作できるようになります。 PCの準備が完了しました。 もしお出かけ先から遠隔操作する場合は、PCがスリープにならないように注意して下さいとのことです。 4.iPhone側の準備 iPhone側の準備をします。iPadでも大丈夫です。 こちらのアプリをインストールしてください。 ⇒ […]

View More

By Hoshino

0

1分間に330文字打てるキーボード「StenoWord(ステノワード)」

テレビのリアルタイム字幕や速記に使われる1分間に330文字も打てるキーボードStenoWord(ステノワード) (画像元:http://www12.ocn.ne.jp/~sokkidou/t10/) 主に入力はこの列のみ 意味不明ですが、左側が子音、右側が母音となっているようです。 詳しい説明と実際に入力している動画があります。 つまることこのキーボードを使いこなせる人がすごい。 圧倒的なスピードです。速いな本当に。 ちなみにこのステノワードは一般には販売されておらず、日本に数校しかない専門学校が取り扱っているようです。 ⇒ スピードワープロ

View More

By Hoshino

0

Manifest.lock: No such file or directoryとかPods-resources.sh: No such file or directoryとか出るとき 【Xcode】【Pod】

こんにちは。最近、起床時間が最大12時間ずれるあっきぃです。起きたら夜の7時だった時の絶望感はやみつきです。ぺろり。 さてさてiPhoneアプリを開発するためにXcodeちゃんでPodを使っているのですがこんなエラーが diff: /../Podfile.lock: No such file or directorydiff: /Manifest.lock: No such file or directoryerror: The sandbox is not in sync with the Podfile.lock. Run ‘pod install’ or update your CocoaPods installation. まぁよくある現象で、再installすれば直ることが多いみたいですが、それでも直らない方へ 1.Manifest.lock: No such file or directoryと出る場合 Configurationsの設定が「None」になってるカモ。 Project > Info > Configurationsのところを確認しましょう。 「None」になってたら「Pods」を選択しましょ。 そしたらこんなエラーが出たよという方 Pods/Pods-resources.sh: No such file or directory 2.Pods-resources.sh: No […]

View More

By Hoshino

0

command not found: lsとか出てしまったら

MacのOSXにて、環境変数のPATHにちょろっと追加しようと思ったのですが、 export PATH=/usr/local/git/bin:$PATH とするのを誤って export PATH=/usr/local/git/bin:$path こうしてしまいました。(最後の大文字のPATHが小文字のpathになってるよ!) PATHの中身は $ echo $PATH/usr/local/git/bin:/Applications/wxMaxima.app/bin:/Applications/gnuplot.app:… こんな感じでpathは $ echo $path/usr/local/git/bin /Applications/wxMaxima.app/bin /Applications/gnuplot.app … こんな感じで、ディレクトリのパスを「:」で区切っているか「 」スペースで区切っているかの違いがあるようです。 そんなわけで、lsもvimも使えなくなりましたーっひゃっほーっ $ lszsh: command not found: ls そんな時はフルパスでコマンドを実行しよう! 誤った変更を加えた.zshrcを編集したいのでvimを起動 $ /usr/bin/vim .zshrc sourceはshell built-in commandなのでいつでも使えます。 $ which sourcesource: shell built-in command $ source .zshrc よっしゃこれで直る! と思ったのですが直らず、ターミナルを再起動したら直りました。 (なんでだろ) めでたし、めでたし。

View More

By Hoshino

0

シンプルな湿度計

乾燥の季節です。 湿度計が欲しくて探していたのですが、温度計とか時計と一緒だったり、デザインがごちゃごちゃしてたり。「シンプルでインテリアっぽくてお値段も手頃なものなんてないのかしら。」 と思っていたらありました。 シンプルに湿度計のみ、デザインもシックでいい感じそしてお値段も1500円くらいといい感じっ こんなん探してたって方多いはず。 ⇒ EMPEX (エンペックス) 湿度計 MONO MN-4824 ブラック(Amazonへ)

View More

By Hoshino

0

【Xcode】 Please verify that your device’s clock is properly set, and that your signing certificate is not expired. (0xE8008018).とか出たら。

Xcodeをビルドしたら Please verify that your device’s clock is properly set, and that your signing certificate is not expired. (0xE8008018). ってなエラーが。 おそらくアメリカ大陸の言語だと思われます。そして意味はおおよそ「デバイスの時間がずれているまたはプロビジョニングファイルの有効期限が切れている。」といったところでしょう。 デバイスの時間設定は間違っていないので、なんかそんなようなファイルの有効期限が切れてしまったのだと思います。 Xcode4,5の時はここらへんのエラーで大変時間をとられたのは、今となっては良い思い出です。そしてXcode6からは優秀でもろもろ勝手にやってくれます。すこし寂しいです。 1.Preferencesを選択 左上のメニューから「Preferences…」を選択 2.AccountsタブからView Details Accountsのタブから、「View Details…」を選択 3.更新マークを押す クルクルを押します。 これで直っちゃう(はず)。 便利な時代になったもんだ。

View More