Month: January 2016

Swift:==はまずい!

=の代わりにまちがって==を使ってしまってもコンパイルエラーが出ない。

昨夜、5行書き換えたら、動いていたものが動かなくなりました。それでふて寝しました。step by stepで追いかけても問題がわかりません。

今朝、しっかり見たら==になっていました。動きとしてはno actionになっているのでAppleには、できればコンパイルエラーを出してもらいたいものです。それとも、これはこれで用途があるのでしょうか。

次のアプリは完成まであと一息。検索機能の追加をすること。あと、そできればカラム幅を調整する機能を実装できるかどうか。2月は確定申告の時期なので、その準備に少なくとも1週間はとられてしまいます。2月10日までに仕上げられるようにしたいのですが、どうでしょうか。

全体の出来は上々です。

Screenshot 2016-01-31 09.27.04

Swift:毎日が新発見、アイコン登録は?

pull down menuは最初のmenuItemがhiddenになるということでいいのかな?

そんなことを思い出しながら一日がはじまります。

アイコンの登録は、アプリアイコンを作成して登録したことがあるのでやり方はわかっています。しかし、アイコンの作り方はどうだったか思い出せず、自分のブログのメモを探すも、出てきません。やれやれ。こうして一日が新たな課題ではじまりました。

しかし、ブログも、タグを入れておかないといざというときに使い物にならない、と朝早くから頭を抱えます。

Keynoteにイメージを貼り付け、丸くマスクしたものをCopy and Paste。ここでPreviewを起動し、File➡️New from Clipboardで開けて、サイズを16×16にし、.pngでsaveする。これをXcodeのAssets.Xcassetsに登録する。このとき、名前をつけるのを忘れてはいけません。

Screenshot 2016-01-30 21.54.41

実際に使うときは、storyboardなり.xibなりでアイコンが名前といっしょに表示されるのでこれを選択するだけです。

Screenshot 2016-01-30 21.57.23

たとえば次のようにimageの欄に名前を指定します。

Screenshot 2016-01-30 22.00.45

たったこれだけのことなのですが、今頃になってようやく理解した次第です。これで絵文字をアイコン代わりに使う呪縛から逃れられます。一歩前進、二歩後退の毎日は続きます。

Swift:NSTextFieldの色付け

NSTextFieldの色付けは.textColorです。

問題は、ツールバーのカラーパネルを使った場合、どうすればいいか?現時点では、よくわからない、調べていますなのですが、わかったところまでメモします。

@IBOutlet var xbOutColorClass:NSTextField?

xbOutColorClass.textColor = NSColor.NSColor.blueColor()

ツールバーのカラーパネルで文字列の色が変更されたときに処理は次の通りです。

var rcColorExec2:NSTextField = NSTextField()

@IBAction func ExecIBActionColorExec(sender : AnyObject) { //色指定
rcColorExec2.attributedStringValue = xbOutColorExec!.attributedStringValue //色をsaveする。
xbOutColorExec?.stringValue = “Exec”//文字列を入れ直す。
xbOutColorExec?.attributedStringValue = rcColorExec2.attributedStringValue//色を復元。
再度tableViewを作り直す。
}

.attributedStringValueには、NSColor = “NSCalibratedRGBColorSpace 0 1 1 1″のような値が入っているので、これを取り出す方法がわかれば、NXTextFieldに設定した色情報をNSTableViewに入れる文字列(String)に反映できます。

しかし、残念ながらこの先が真っ暗、お手上げです。

Swift:NSTableViewの文字列の色付け

なるほど。NSAttributeStringを使えば、文字属性を制御できますね。

ずっと前からNStableViewの中の文字列に色をつけたり、文字サイズを変更したりするにはどうすればいいのか、不思議に思っていました。

特定文字列に色をつけたり、boldにできれば、視認性が高まるし、検索した用語であれば一発でどこにあるか探し出せます。表自体をcell basedからview basedに変更しないとできないというようなブログを見かけたので、少し前にview basedに変更しようとしていたのですが、力尽き、そのうち忘却してしまいました。

それで、昨夜からカラム幅の制御と検索機能を追加したいといろいろ調べていたら、不思議なことに何回もNSAttributedStringと出会いました。あまり関係ないことの検索をしていたのですけどね。

仮に一部のStringをNSAttributedStringに変更し、属性を赤い文字にしてみました。OKです。ただし、この変更に伴い、従来、Stringでハンドリングしていた箇所をNSAttributedStringからStringに変更するプロセスをワンクッション入れないといけません。Screenshot 2016-01-28 13.16.49

コードはいたって簡単ですが、呼び出し側からフォント、色などの属性指定ができるようにする方が便利だと思い次のようにしました。まだ、完全にテストしていないのですが、次の場合、wAtt?.stringが元々のStringの内容である“target object”になります。カラム内の文字検索などを行う場合、wAtt.stringに直してから文字列のハンドリングをする必要があります。フォント名、サイズ、カラーはユーザーが指定できるようにするべきで、呼び出し側の処理はいろいろ必要なので、面倒ですが受け渡しパラメタは長くなりました。

let wFont:NSFont = NSFont(name:”Times-Roman”, size:10)!
let wAtt = ExecSetAttribute(“target object”, pFont:wFont, pAlignment:”Left”, pColor:NSColor.redColor())

func ExecSetAttribute(pString:String, pFont:NSFont, pAlignment:String, pColor:NSColor) -> NSAttributedString? {
let wStyle = NSParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle
if pAlignment == “Center” { wStyle.alignment = NSTextAlignment.Center }
else if pAlignment == “Right” { wStyle.alignment = NSTextAlignment.Right  }
else { wStyle.alignment = NSTextAlignment.Left   }
let wAttribute = [ NSForegroundColorAttributeName:pColor, NSFontAttributeName:pFont, NSParagraphStyleAttributeName:wStyle]
return NSAttributedString(string:pString, attributes: wAttribute)
}

調べているうちにお腹いっぱいになりました。検索機能とカスタムツールバーを追加しないといけないのですが、冒頭に書いた通り、この色付けは長い間懸案事項になっていただけに、わかってしまうと、すぐにお腹いっぱいになりました。歳をとると、毎回毎回、たくさん食べられません。

参考:SwiftでNSAttributedStringを使って文字列を装飾する(UILabelに画像を表示する)

Swift:MesaExif @Mac App Store

Mac App Storeでは、こんなふうに表示されるのですね。

なにもかもはじめてのことで、こんな具合にApp Storeで表示されるとは知りませんでした。アプリを開発しようという励みになりますね。英語版で登録しましたが、Firefoxは日本語でも表示されますので、言語によって自動的に読み込まれるものが決まるようです。

Screenshot 2016-01-28 05.59.22

Swift:MesaExifが承認されました!

MesaExifがAppleから承認され、AppStoreの販売棚に並びました。

今朝、Appleからアプリの承認の連絡がありました。Apple MenuをプルダウンしてApp StoreでMesaExifを検索すると、確かに販売されています。無料でもよかったのですが、問い合わせ対応が手に負えなくなるといけないので、有料にしました。

アプリ向けのページはここです。ユーザーズガイドも入っています。

アプリ登録ははじめてだったので、Appleから指摘されたUI周りの修正に時間がかかってしまいました。この修正はプログラムが軽くなるので「良いこと」と受け止めました。

修正前のものはlook and feelがAppleらしくないというよりか、Windowsの出来の悪いアプリという印象でしたが、修正によってお利口なAppleアプリに変身しました。プログラム的には、NSOpenPanel / NSSavePanel / Sandboxにか関わるものです。Sandboxの留意点は、ユーザーがread/write指示した以外のファイルアクセスは行わないが基本で、どうしても必要ならLibraryを使うというAppleの規約に従う必要があります。

修正版は先週の土曜日の夜にpostして、今朝、完了通知が得られたので、Appleのレスポンスの良さに感心しています。2回目でクリアできたのは何よりです。

目下、次のアプリを2月中にリリースするべく取り組んでいます。内容は、swiftのソースコードを解析し、モジュール構造をリストアップする開発ツールです。開発/改造はほぼ終わっていて、あと、ドキュメントとマイナーな改善がいくつか残っているだけです。

Screenshot 2016-01-27 09.47.00

Swift:標準アイコン16×16の取得

昨夜取り出した標準アイコンのサイズはやはり32×32でした。

16×16のサイズに直さなければならないのですが、やり方がさっぱりわかりません。iOSはこうすればリサイズできるというサンプルがあちこちにあります。しかし、OS Xはさっぱりです。

あっ・・・、リサイズと言うのですね。なるほど。

泣きながら、調べ続けました。iOSのコードを参考にしてあれこれ試したが、どれもこれも全然OS Xに該当するものがなく全滅。最後にNSImage をリサイズするに行きあたり、これで解決できました。実際は、このブログの中にある「期待どおりに使えなかったリサイズ方法」を使いました。感謝いたします。

コードは次の通りです。

func ExecGetIcon16x16(pPath:String) -> NSImage {  //<*アイコンを16×16のNSImageでgetする*>
let wIcon32:NSImage   = NSWorkspace().iconForFile(pPath)//アイコンイメージをgetする。
let wSize = CGSize(width:16.0, height:16.0)
let wIcon16 = NSImage(size: wSize)
let wRect = NSRect(x: 0.0, y: 0.0, width: wSize.width, height: wSize.height)
if let imageRep = wIcon32.bestRepresentationForRect(wRect, context:nil, hints:nil) {//lockFocusは通常スクリーンで 72dpi/Retina スクリーンで 144dpi。
wIcon16.lockFocus()
imageRep.drawInRect(wRect)
wIcon16.unlockFocus()
 }
return wIcon16  //== return == 16×16アイコン
}

Screenshot 2016-01-26 18.49.17

なお、こんなサイトがGitHubにありました。iOSとOS Xで使い分けているところで参考になるものがあるかもしれません。

女房が高熱で病院に行ったら、インフルエンザと判明しました。私も一昨日博多に行ってから何となく風邪気味で不調です。インフルエンザだと嫌だな。

Swift:標準アイコンの取り方

フォルダやファイルのアイコンを取り出し表示したい。

確かにそうしたいときが多々あります。これは意外と簡単です。

Pulldown menuのNSMenuItemにアイコンとそのファイルパスを設定する場合、次のような手順になります。

var wIcon:NSImage   = NSWorkspace().iconForFile(wProjectFolerpath) 

var wMenuItem:NSMenuItem  = NSMenuItem() 

wMenuItem.image = wIconFolder     
wMenuItem.title = wProjectFolerpath        

少し気になったのは、pulldown menuに設定するとき、配列のURLからアイコン+ファイル名になるようにしたのですが、ybOutNameMenu.addItem(wMenuItem)のように書いてmenuItemを追加するようにしたところ、登録済みでエラーになったのでwMenuItemを初期化してから.imageと.titleを設定するようにしました。

あともうひとつ。アイコンは32×32のようなので16×16に直す必要があります?多分。続きは、あした調べます。Screenshot 2016-01-26 00.58.01