UITableViewでセクションヘッダをタップするとそのセクションの先頭にスクロールさせるには

iPhone, iPad で長いリストを扱うときにセクションの固まり項目をきれいに表示させたくなります。 Newstrush というニュースリーダーアプリでは、記事のカテゴリ毎にセクション化しています。 ↓ このアプリではセクションのヘッダ部分をタップすると、そこが先頭にくるように細工をしてあります。 実装方法は下記の通り。 セクションヘッダビューの定義 セクションヘッダ用のカスタムViewを作成します。 カスタム init メソッドでセクションインデックスとテーブルビューのポインタを渡して、touchesEnded イベントでUITableViewの scrollRectToVisible メソッドにセクションから始まる画面領域の矩形を渡して呼び出します。 TableSectionHeaderView.h #import <UIKit/UIKit.h> @interface TableSectionHeaderView : UIView { @private id _tableView; int _sectionIndex; } \- (id)initWithSectionIndex:(NSUInteger)index forTable:(id)tableView; @end TableSectionHeaderView.m #import "TableSectionHeaderView.h" @implementation TableSectionHeaderView \- (id)initWithSectionIndex:(NSUInteger)index forTable:(id)tableView { self = \[super init\]; if (self) { _sectionIndex = index; _tableView = tableView; } return self; } \- (void)dealloc { _tableView = nil; \[super dealloc\]; } \- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { CGRect rect_ = \[\_tableView rectForSection:\_sectionIndex\]; rect_.size.height = \[_tableView frame\].size.height; \[\_tableView scrollRectToVisible:rect\_ animated:YES\]; } @end ※ UITableView の参照は相互で retain しないように id にしてあります。 ...

2011年7月9日 · Toshimitsu Takahashi

iPhoneアプリで左にアイコンのあるUITabBarもどきを作るには

トレンドトピックというGoogleトレンドとTwitterトレンドのリスト、そこからニュース, ブログ, ツイートの検索結果を表示するアプリをリリースしてます。 バージョン 1.8からTwitterトレンドを追加するにあたり、既存のGoogleトレンドのリストとどう切り替えUIを用意するか考えて、Tab Bar を使うことにしました。 ただ、通常の Tab Bar はテキストがアイコンの下にくるため、49ピクセル使ってしまいます。今回の切り替えでは2項目しかないため、左にアイコンを右にテキストを置くようにしたいと単純に考えました(iPad版では画面に余裕があるため普通に使っています)。 結果から言うと UITabBar を継承してどうにかするのは非常に難しいことがわかりました。layoutSubviewsメソッドでアイコンの位置を変えても、項目がタップされる度に元に戻ってしまいます。 そこでもうUIButtonを2つ並べてイメージをセットして Tab Bar を実現することに。 イメージの作成 Tab Barのアイコンに対してエフェクトをどうかけるのか調べるのは大変なので、そういう状態の静止画を撮れるサンプリングプロジェクトを作りました。 CustomTabBar.h #import <Foundation/Foundation.h> @interface CustomTabBar : UITabBar { } - (void)shiftPosition; @end CustomTabBar.m #import "CustomTabBar.h" @implementation CustomTabBar - (void)shiftPosition { for (UIView *item inself.subviews) { for (UIView *view_ in item.subviews) { NSString *className = NSStringFromClass(\[view_ class\]); if (\[className isEqualToString:@"UITabBarSwappableImageView"\]) { CGRect frame_ = view_.frame; frame_.origin.x = 0; frame_.origin.y += 5; view_.frame = frame_; } } } } @end 上記の CustomTabBar を使った UITabBar に項目をセットした状態にします。 実行時にボタンを押すと shiftPosition メソッドが呼ばれるようにしておき、その都度でスクリーンショットをとります。UITabBarSwappableImageView というドキュメント非公開のクラスがアイコンの ImageView クラスになります。 あとはスクリーンショットから画像を切り出して、通常時と選択時のpngファイルを作ります。これをノーマルとRetina向けにそれぞれ行います。 ...

2011年7月7日 · Toshimitsu Takahashi

Adobe AIR 2.6 マスターシリーズの連載してます

僭越ながら Adobe Developer Connection にて Adobe AIR 2.6 マスターシリーズの連載をさせていただいております。 第1回 ネイティブ機能の拡張 カーソルやメニューなどデスクトップ系の機能追加をメインに紹介しています。 第2回 iOSやAndroid向けモバイルアプリ開発環境の新機能 iOS 4 のサポート, Android の USB デバッグなど AIR for iOS, Android 開発の新しい機能について紹介しています。 http://www.adobe.com/jp/joc/devnet/air/articles/adobe_air_03.html CameraUI, カメラロール, マイクなどモバイルアプリケーション向けAPIについて紹介しています。 (2011/07/06) http://www.adobe.com/jp/joc/devnet/air/articles/adobe_air_04.html StageWebView、仮想キーボードについて紹介しています。 (2011/08/24) 上記の全4回が公開中です。

2011年6月18日 · Toshimitsu Takahashi

Ubuntu で Apache 2.2 でマルチドメイン SSL を設定するには

マルチドメインSSL証明書は本来IPアドレスごとに1FQDNだった SSL ホストを、1IPアドレスで複数のFQDNに対応させるものです。 要するにhttpsでも名前ベースのバーチャルホストが使えるようになります。 Apache 2.2.12 以降で SNI(Server Name Indication)という SSLプロトコルに対する拡張機能がサポートされ、そのモジュールが mod_gnutls になります。 ただ Server Name Indication - Wikipedia, the free encyclopedia にある通り、SNI は Windows XP の IE ではサポートされないなど、まだまだ一般的使うには早そうです。 今回、さくら VPS サーバの Ubuntu 上でセットアップしたのでまとめておきます。 mod_gnutls をインストール・適用 # apt-get install libapache2-mod-gnutls # a2enmod gnutls /etc/apache2/ports.conf を編集 mod_ssl は一応コメントアウト、mod_gnutil を有効にする。SSLStrictSNIVHostCheck はSNIに未対応のブラウザがデフォルトのCommon Nameを参照するように off にする。 #<IfModule mod_ssl.c> # # If you add NameVirtualHost *:443 here, you will also have to change # # the VirtualHost statement in /etc/apache2/sites-available/default-ssl # # to <VirtualHost *:443> # # Server Name Indication for SSL named virtual hosts is currently not # # supported by MSIE on Windows XP. # NameVirtualHost *:443 # Listen 443 #</IfModule> <IfModule mod_gnutls.c> Listen 443 NameVirtualHost *:443 SSLStrictSNIVHostCheck off </IfModule> サイトの設定 デフォルトを無効にして、それぞれのサイト定義ファイルを作りSSLの設定を各VirtualHost内に定義します。パスは共通の証明書なので同じなります。 ...

2011年2月24日 · Toshimitsu Takahashi

Windows Home Server で TCP 設定の最適化のススメ

Acer Aspire easyStore H340 (Windows Home Server に PS3 Media Server をインストールして、PlayStation 3 で DLNA 再生を色々と試していました。 しかし如何せんハイビジョン(ビットレートの高い)な動画の再生が重かった。Aspire easyStore の CPU が Atom) と非力なのが原因かと思ってたんですが、デコードするのが PS3 になるはずのコーデックでもそうだった。そして Windows 7 のメインマシンとファイル転送してても70Mbps(LANは1Gbps)くらい普通に出ていたのでネットワーク転送に問題があるとも思ってませんでした。 ただ一応、TCP周りのチューンナップしておくかと思い、NetTune を使って設定しました。 設定の値には最近買ったルーターのページ AtermWR8370N(STモデル) | 製品情報 | AtermStation を参考にしました。 *:RWIN:262144bytes、MTU:1500bytesに設定。 という記述です。 Windows Home Server にリモートデスクトップして NetTune を C:\Program Files (D:\以下はダメ)などに解凍して入れます。 変更した設定は下記のとおりです。再起動して反映すると、普通にハイビジョン動画がさくさく再生できました。ホームサーバーOSだから適当に最適化してるだろうと思ってたらそんなことはなかった模様。 Windows Home Serverをお使いなら設定しておくことを強く勧めます。 その他の関連記事 Windows Home Server 搭載の Acer Aspire easyStore H340-S1 レビュー - Tosshi Note BRAVIA での DLNA と Windows Home Server (Aspire easyStore H340) と Windows 7 - Tosshi Note

2011年1月29日 · Toshimitsu Takahashi

.NET のクラスライブラリが同じパスに存在する別の DLL を動的にロードするには

動的に別のDLLをロードするときのメモ。 System.Reflection.Assembly.GetExecutingAssembly().CodeBase で自身のパスが取れる。 file:\ が先頭に付くときがあるため取り除いている。 string selfDirPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); if (selfDirPath.StartsWith(“file:\")) { selfDirPath = selfDirPath.Substring(6); } System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(selfDirPath, “Another.dll”));

2011年1月14日 · Toshimitsu Takahashi

Adobe AIR 2 のデータグラムソケットを使って Wake on LAN でリモート PC を起動するには

Adobe Developer Connection に AIR 2 マスターシリーズの連載が始まりました。 僭越ながら を寄稿いたしました。こちらでは Echo プロトコルクライアント・サーバーを UDP, TCP でそれぞれ実装しているサンプルを載せています。 上記に付随して後から思いついたサンプルの1つということで、Wake on LAN でリモートホストをブートするアプリケーションを作りました。これをスタートアップなどに登録しておけば、自分のメインPCを起動したと同時にホームサーバーなどを起動することができます。 見えないアプリケーション コンソールアプリケーションというべきですが、Window レスな AIR アプリケーションを作るには 新規 Flex プロジェクトの作成ウィザードにおいて、メインアプリケーションに AS ファイルに指定します。 Main.as マジックパケットを送信してアプリケーションを終了するだけです。 package { import com.tilfin.wakeup.MagicPacket; import flash.desktop.NativeApplication; import flash.display.Sprite; /** \* Wakeup On LAN 用のマジックパケットを投げてリモートPCをブートします。 */ public class Main extends Sprite { public function Main() { var packet:MagicPacket = new MagicPacket("FF-0A-E4-8A-74-67"); packet.broadcast("192.168.1.255"); NativeApplication.nativeApplication.exit(); } } } マジックパケット マジックパケットは Wake-on-LAN 用に送信するパケットです。 先頭の6バイトには 0xFF を置きます。さらにターゲットのホストの NIC の MAC アドレスのバイトデータを16回連続で並べたものになります。 ...

2010年9月29日 · Toshimitsu Takahashi

Flash Professional CS5 の Package for iPhone で AIR 2 のネットワーク機能をチェック

Package for iPhone が復活の兆しだということで、AIR 2 の機能が現状どれくらい使えるのか、とりあえずネットワーク系クラスの isSupported プロパティを確認してみました。 残念ながら isSupported はどれも false になってしまった。

2010年9月12日 · Toshimitsu Takahashi

Settings.bundle の Root.plist から Title, Value を持つ Dictionary の配列をロケールに合わせて取得する

Settings.bundle の Root.plist をアプリケーションに作成すると、iPhone/iPad の「設定」画面とそれによるパラメータ設定が可能になりますが、その中の PSGroupSpecifier の候補リストをアプリケーション内部から取得する方法について明記します。 設定値は、iOS のシステムロケールによって適切な Title に置き換わります。そこも同様になるように処理します。 Settings.bundle の Root.plist 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>StringsTable</key> <string>Root</string> <key>PreferenceSpecifiers</key> <array> <dict> <key>Type</key> <string>PSGroupSpecifier</string> <key>Title</key> <string>SearchTarget</string> </dict> <dict> <key>Values</key> <array> <string></string> <string>ja_JP</string> <string>en_US</string> <string>en_GB</string> </array> <key>Titles</key> <array> <string>SystemLocale</string> <string>Japan</string> <string>USA</string> <string>UK</string> </array> </dict> </array> </dict> </plist> PreferenceSpecifiers / PSGroupSpecifier の取得処理 Settings.bundleの取得 まず、Settings.bundle への参照を取得します。 ...

2010年9月8日 · Toshimitsu Takahashi

Win CS5 Web Premium の Flash Builder 4 を Premium 版にアップグレードし Mac にも入れた

Adobe Creative Suite 5 Web Premium (以下、Master Collectionも含む) には Flash Builder 4 Standard が入っています。ただ残念ながら、Web Premium なのに Flash Builder 4 は Standard 版です。Adobe は CS5 Web Premium の所有者に、Flash Builder 4 Premium へのアップグレードライセンスを提供しているので、これを購入することで Premium にできます。ちなみに60,000円とそれ程安くはないです。 先にポイントを Windows 版 CS5 Web Premium パッケージを持っている人が Flash Builder 4 Premium アップグレードライセンスを購入すると、 Eclipse プラグイン版 Flash Builder が使える。 Mac OS X でも Flash Builder を使える。 以上が可能になる。 アップグレードライセンスの購入 http://www.adobe.com/go/flashbuilder_upgrade 上記のページで CS5 Web Premium, CS5 Master Collectionからのアップグレード を選択して購入します。 購入後に、WIN/MAC どちらもスタンドアローン版とプラグイン版がダウンロードできます。あと Cold Fusion Builder も。 私はパッケージ版の Windows 版 CS5 を持っていますが、Mac OS X でもアップグレードした Flash Builder 4 Premium が使えるようです。 ...

2010年9月6日 · Toshimitsu Takahashi