2014年12月12日金曜日

SwiftでOSXアプリ開発・ImageKit を使ってみる

写真のサムネイルを並べるために、NSCollectionView を使ってみたが
Xcode の ObjectLibrary (右下のやつ)を眺めてたら
ImageKit Image Browser View というのものがあった。
ちょっとぐぐってみると、スライダーでサムネイル画像の調節までできるとか、できないとか。

使ってみようとしたが

cannot decode object of class (IKImageBrowserView)
user of undeclared type 'IKImageBrowserView'

こんなエラー出る。

どうやら Quartz.framwork を Build Phases の Link Binary With Libraries でインポートしなければならないらしい。
更にoutlet とかしたい場合は、そのクラスの先頭で

import Quartz

を書けばOKだった。

環境
OSX Yosemite
Xcode6.1.1

2014年12月9日火曜日

SwiftでOSXアプリ開発・keyDownメソッドが呼ばれなくてハマったけど解決

NSView で KeyDown メソッドを定義したが
呼ばれない。

acceptsFirstResponder を override して
 true を返す必要があるらしいが
( Swiftのソースでは ) acceptsFirstResponder は入力補完で出てこないし
override するとエラーになるので
困っていたが
結局、下記のように記述すればOKだった。

入力補完されなかいからといって、そのメソッドが存在しないというわけではないらしい。



class View: NSView {

    func acceptsFirstResponder() -> Bool {
       
 return true
    }               

    override func keyDown(theEvent: NSEvent) {      
    }


環境
OSX Yosemite
XCode6.1.1



2014年12月8日月曜日

SwfitでOSXアプリ開発・プログラムからウィンドウを開く


NSWindowControllerのサブクラスを定義。

class ChildWindowController: NSWindowController {

ストーリーボード上にNSWindowControllerを配置して
カスタムクラスに、さっき定義した ChildWindowControllerを設定


開く処理

        var childWindowController:ChildWindowController = self.storyboard?.instantiateControllerWithIdentifier("ChildWindowController") as ChildWindowController

        self.view.window?.addChildWindow( childWindowController.window! , ordered: NSWindowOrderingMode.Above)

環境
OSX Yosemite
Xcode 6.1.1

2014年11月28日金曜日

SwiftでOSXアプリ開発・アプリのウィンドウをフルスクリーンにする

だいぶハマったので備忘録

まず、ストーリーボード上で、メニュー項目に、フルスクリーンを追加


そして、同じくストーリーボード上で
Window を選択して
Attributes inspecter

Full Screen
という項目があるので
Primary Window
を選択


無事、開発中のアプリでフルスクリーンできた。

参考サイト
http://ameblo.jp/firststepforward/entry-11508622193.html

環境
Xcode6.1
OSX Yosemite

2014年11月23日日曜日

SwiftでOSXアプリ開発 - ファイルを開く処理

Swiftで、Mac OSX アプリケーションの開発を始めました。
初歩的なところで、躓いたので備忘録的。

まず、Xcodeで、Cocoaアプリケーションを選択しプロジェクトを作成。
何も作っていないけど、とりあえず実行してみた。

FileメニューのOpenが選択できない。
ここで少し躓いた。

これは、プロジェクト作成時に
Create Document-Based Application
のチェックをONにすることで解決。

同時に、
Document Exteinsion (ドキュメントの拡張子)も指定できる。
デフォルトでは、mydocという拡張子のファイルを開ける。

これを後から変更するには
Xcode上で左側(なんていうんだっけ)の
プロジェクト名を選択
TARGETSの
プロジェクト名を選択
infoタブ
Document Types
で設定できる。

ここで、複数のファイル種別を設定できる。

これを見つけるまで時間かかった。

環境
Xcode6.1

2014年10月27日月曜日

Safari の Top Sites の サムネイル画像を加工する

Safari の Top Sites のサムネイル画像がいつの間にか更新されなくなったらしい。

Top Sites に登録したいくつかのサイトがログインフォームのままで、サムネイルから内容が分かりづらい。
ログイン後のサイトを識別できるようなサムネイル画像に置き換えたい。

Safari の Top Sites のサムネイル画像は、ここにあるらしい。
~/Library/Caches/com.apple.Safari/Webpage Previews/*

Finder の「移動」メニューから、「フォルダへ移動」
で、Finder上でフォルダを開いてみる。

下記のようなファイル名が沢山あって、ファイル名からどのサイトかはわからない。

1A25CD48094240E6C0519ECE40DC7060.jpeg
1A25CD48094240E6C0519ECE40DC7060.png

試しに全部削除してみるが
再度作成されたサムネイル画像は、やはり同じようにログインフォームの画像だった。。

結局、プレビュー.appでその画像を開いて

自分で、ちょうどいい画面をスクリーンキャプチャした画像を貼り付けて
保存。

Safariを終了して再度、起動すると
Top Sites の サムネイル画像が更新されていた。

更新するのは、jpegだけでいいようだ。

面倒なやり方だけど、とりあえず、Top Sites が使いやすくなった。

環境
Safari 7.1
Mac OS X 10.9.5 Marvericks

2014年10月9日木曜日

Evernote for Mac 表はGoogle スプレッドシートで作成してコピペ

Evernote for Mac で、表の編集がやりにくい
(Windows やスマホなど、他のデバイス では使ってないので for Macだけの問題ではないのかもしれないが)

列や幅のサイズ調整とか
細かいことがやれないようだ。

ググると、データを直接書き換えるような記事は見つかる。
私はそんな面倒なことはしたくない。

そこで、結局は Google ドライブの
スプレッドシートで表を作って
Evernote にコピペしている
その下に、Google スプレッドシートへのリンクを貼り付けている。

これはこれで、リソースを2重に管理することになるのだが
個人的にはこのやり方がベストだった。

特に変わったことはやってないのだが、結局みんなこんな感じ?



2014年10月7日火曜日

iPhone 6 Plus を18日間、使ってみた感想

iPhone 6 Plus を発売日に入手した。
今日で18日目、なんとなく感想がまとまってきたので書いてみます。

よかった点


  • 大きいので情報量が多い、GunosyやFeedlyで情報収集などがしやすい(する気になる)
  • カメラ性能がよくなってるっぽい
    • ブレが少ない
    • 暗いところでもキレイに撮れる
    • スローモーション動画が240fps
  • 液晶ディスプレイがキレイになってるらしい(たしかに印刷物みたい)


悪かった点


  • 大きいので、ポケットに入れてると落ちそうな気がして心配
  • ポケットに入れてるの忘れて座ってしまって折れそうで心配
  • 大きいので、ポケットから取り出すとき落としそうな気がする

特に、外出中に大きさのデメリットを感じた。

外出中は、iPhone5sの方が便利だな。
外出時にSIM差し替えようかな。
それも面倒だな。。。

そうだ、カバン持ち歩くようなときは2台持ちで
デザリングすればいい。


Instant Hotspot という機能で、同じiCloudアカウントにログインしていたらデザリングが便利にできるらしい。

どんな風に便利かというと
SIMがささったiPhone 6 Plus を親機、
SIMがささってない iPhone 5s を子機
とすると
親機のインターネット共有がOFFのままでも
子機からデザリングで接続できる。

電話も子機で取れるし
チャットもできる。
これは便利そうだ。
電話やチャットを子機で受信できるのは、同じwifiに接続している場合のみだった。
デザリングではダメだった。
とても残念。

移動中の地図確認や、インターネット利用で
小さい5sを使うといったメリットはあるが
電話やチャットの受信まで出来ると、すごくよかったのに。。。

ちなみに、iPhone同士はbluetoothでペアリングできないらしい。
(仕様としてサポートしてないそうだ)
これをやろうとして、しばらく嵌った(ハマった)。

参考にしたサイト



大きなiPhone 6 Plus と iPhone5s の2台利用というケースを考慮して
iOSのバージョンアップで
iPhone同士のbluetooth ペアリングが出来るように
改善されることを期待してます。


2014年10月5日日曜日

Safari と Chrome の違いを発見(?)

Mac OSX でメインのブラウザとしてChromeを長年、愛用してきた。

Chromeは、WEBページの一部(画像など)の読み込みが遅い場合に
スクロールしようとしても、モタついて待たされる感じがした。
そういえば、ブラウザの動作自体かなり重たく感じるときが、たまにあるなーと思いだした。
そこで、早いという噂(?)の、Safariを試してみた。

とても早くて軽く感じた。

画像など読み込みが終わっていないコンテンツがあっても
ページのスクロールには影響が出ないような感じ。
画像等の読み込み自体も早い感じ。

Safariが早いと聞いてピンと来なかったけど
重たいページを開くときに歴然とした差を感じた。

どれも体感的かつ主観的な感想なので、一応タイトルにも(?)を入れておいた。

メインのブラウザをSafariに戻そうと思った。

環境
OS X 10.9.5 Marvericks
Chrome バージョン 37.0.2062.124
Safari バージョン 7.1 (9537.85.10.17.1)

2014年9月25日木曜日

iPhone 6 Plus のケースは、とりあえず100均のこども用靴下

100均で変える子供用の靴下。
iPhone 6 Plus にぴったり合う。
ちょうど、かかとの折り返しでフタみたいになるし。
基本、裸運用なのだけど
たまにケースに入れたいときにちょうどいい

理想のケースに巡りあうまでの仮ケースにもちょうどいい

2014年9月17日水曜日

iPhone 6 Plus 予約済。期待していること。

SIMフリーのiPhone 6 Plus ゴールド 128GBを予約完了
9月19日に到着予定。
待ちきれないので、期待している点を挙げてみる。

画面が大きくなったので...


  • FeedlyやGunosyでの情報収集も効率よくなるかも
  • 書籍やコミックも読みやすくなるかも
    • iPhoneでどこでも読書とか今度こそ定着したらいいな、自分に。
  • 映画とかビデオも更に良い感じになるかも
    • 5sでもHD画質の映画とかとてもキレイだったけど更に。。期待
  • ピクセル密度が高くなったことを実感できるらしい。5sでも十分なんだけど、更にキレイとかどんなだろう

カメラの出っ張りで...


望遠レンズを取り付けられるといいな
あの出っ張り部分だけで固定するのは無理がありそうなので
ケースみたいにボディに着脱するんだけど
でっぱりを利用してカメラレンズ位置を合わせるような製品がでないかな...

安いHDハンディカムとかインタレース(走査線を交互に描画するようなアレ)だったりして、汚い動画になるけど、iPhoneはプログレッシブなので動画もキレイ


そのiPhoneに光学ズームがあれば、もう他にビデオカメラも要らないなー

ケースどうしよう


いつも袋状の皮ケースに入れていて、使うときは取り出して裸で使ってる。
(iPhoneが裸って意味。一応w)
基本、裸運用なのだけど、なんかケースないと不安だなー
明日、100均いってみよっと。


3日後が楽しみだ

9月18日(木)19:17 追記


Apple Store の注文ステータスが
出荷準備中 から 出荷完了 に変わった!!

いつ出荷するのか、19日に、ちゃんと到着するのか
やきもきしながら何度もリロードする日々でしたが
これなら明日(19日)に届きそうだ...

どこから発送するんだろう
国内からだといいのだけど...

9月18日(木)20:27 追記


Apple Store の注文履歴の配送状況を確認から
クロネコヤマトの伝票番号で荷物問合せ。
伝票番号が登録されて荷物追跡可能になった
16:27 ADSC支店 荷物受付となっている。
荷物問合せページに、表示されるまでタイムラグがあったようだ。
ADSC支店は国内で、場所はわからないが電話番号は東京03となっている。
これなら明日確実に届くな。

あー楽しみすぎるw

9月18日(木)21:03 追記


SMS ? iMessage ? に、Apple Storeから発送のお知らせが来た

実際には、クロネコヤマトの荷物受付16:27が時系列で一番早い情報となり
諸々、タイムラグがあって表示されているようだ。
今日の0時頃には近所の配達店に到着しそう。
実はもう来てるかも。
連絡して受取に行けるのかなー

2014年9月3日水曜日

Xcode6 beta7 でビルドエラー Type 'ViewController' does not conform to protocol 'UITableViewDataSource'

Xcode6 beta6 までは出ていなかったエラーが
beta7 では発生するようになった

    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {



    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

上記のように3箇所の ! を外したら
このビルドエラーは解消された

2014年8月13日水曜日

XcodeからiOS SImulatorを起動しても「Unable to determine device.」で使えないとき

こんなエラーが出るとき
ちなみに、TimeMachineで復旧した環境で発生しました。

下記のように、iOS Simulator のメニューから
Manage Devices... を開いて

Devices ダイアログの
左下の+ボタンから
必要なデバイスを追加して
iOS Simulator が使えるようになりました。

環境
OSX 10.9.4 marvericks
Xcode6 beta5

2014年8月8日金曜日

Xcode6 ステータスバーの文字色を白くする

背景色の都合で、ステータスバー(キャリア名、アンテナ、時刻、バッテリーアイコン)の文字色を白くしたい

    override func preferredStatusBarStyle() -> UIStatusBarStyle{
        return UIStatusBarStyle.LightContent

    }

これを、ViewController.swift に追加しただけで白くなった。
備忘録。

環境
Xcode6 beta5

Xcode6 beta5 外枠とのマージン

Xcode6 beta5 になってから
Storyboard上で、auto layout の設定で
スーパービュー(配置上の親ビュー)から ゼロ指定しても
余白ができてしまう



これまで通り?
マージンを取らずにピッタリ寄せる場合は


 stroryboard 上の、Auto Layout の設定をクリックした状態で





First Item または、Second Item の Relative to margin を Offにすれば



このようにマージンがなくなる
忘れるとまた嵌りそうなので備忘録。

環境
Xcode6 beta5

2014年8月7日木曜日

Xcode6 beta5 ではプロジェクトを作りなおしたほうがいいみたい

2014年8月6日にXcode6 beta5 が公開されていたようなので
インストールした。

Xcode6 beta4 で開発していたプロジェクトをそのまま
beta5 で開いたのだが...

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name:UIKeyboardWillHideNotification, object:1)

キーボードの通知でどうしてもクラッシュする

dyld: Symbol not found

beta5 で、新たにプロジェクトを作成して
処理などを移行したら、問題なく動いた。

何かXcodeバージョン間の移行手順などがあるのだろうか...



Swift エラー Type 'ViewController' does not conform to protocol 'UITableViewDataSource'


ViewController に、UITableView を追加した場合
下記のように、スーパークラスを定義する


class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

ここで
Type 'ViewController' does not conform to protocol 'UITableViewDataSource'

こんなエラーが出て少し嵌ったのでメモ

下記のような必要なメソッドを定義するとエラーは解消される

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) ->     func tableView(tableView: UITableView!, canEditRowAtIndexPath indexPath: NSIndexPath!) -> Bool {
    func tableView(tableView: UITableView!, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath!) {
    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {

これ、つい忘れてしまう

環境
Xcode6 beta5

2014年7月11日金曜日

SwiftコードだけでUITableViewを配置

Storyboardを使わずに、Swiftコードだけで
UIViewController に UITableView を配置する例

( UITableView を配置する母体となる UIViewController は
Storyboard上に存在している前提です )


import UIKit

class HogeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var tableView : UITableView = UITableView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        tableView.frame = CGRectMake(0, 45, self.view.bounds.size.width, 1000)
        self.view.addSubview(tableView)
        
        tableView.delegate = self
        tableView.dataSource = self

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // セルの数
    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int  {
        return 1
    }
    
    // セルの設定
    func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        cell.textLabel.text = "セル \(indexPath.row)番目"
        cell.detailTextLabel.text = "詳細"
        return cell;
    }
    
    // セルが選択されたときに呼ばれる
    func tableView(tableView: UITableView?, didSelectRowAtIndexPath indexPath:NSIndexPath!) {
        println("選択された \(indexPath.row)番目")
    }

}

動作確認環境
Xcode6beta3

2014年7月10日木曜日

Swfitでアプリ内共通変数 ( グローバル変数? )



AppDelegate.swift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
                            
    var window: UIWindow?
        
    var userId:Int = 0     //  <==== この変数を他のクラスからアクセスする

    func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
        // Override point for customization after application launch.



ViewController.swift (他のクラス)

class ViewController: UIViewController {
                            
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        // AppDelegateクラスのメンバー変数を参照する
        var app:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
        println(app.userId)

    }


動作環境
Xcode6beta3

2014年3月27日木曜日

MAMP 3.0.3 でバーチャルホスト設定

以前のバージョンの設定方法をぐぐって
/Applications/MAMP/conf/apache/httpd.conf
/Applications/MAMP/conf/apache/extra/httpd-vhost.conf
/etc/hosts
を、変更したが目的のドキュメントルートを読みに行ってくれなくて、しばらくハマってたけど....

MAMP 3.0.3 では
アプリの画面からバーチャルホストを設定できるようだ
なんだ簡単なことだった


/etc/hosts への登録も自動でやってくれる
便利だなー

ちなみに、MAMP (無料版)と、MAMP PRO (有料) は一本化されて
スタンドアローンで使うなら試用期限すぎてもOKっぽい

アプリケーションフォルダに無料版と有料版(PRO)の両方があった