[OS X] 透過型のTwitterクライアントを作ってみた
1 はじめに
今回は、Macで動作する透明のTwitterクライアントを作ってみました。
作成した目的は、セッション中などにプレゼン資料の上で表示したかったからです。
記事内でも説明は致しますが、詳しくは、下記のコードをご参照ください。
2 STTwitter
Twitterのデータ取得には、STTwitterを使用させて頂きました。
https://github.com/nst/STTwitter
使用方法は、Github上のREADMEや、デモコードの中に詳しく記載されており、非常に簡単に利用できます。
下記は、その主要な部分です。カスタマーキー・カスタマーシークレット・ユーザ名・パスワードで認証して、queryで指定した文字列を検索しています。
STTwitterAPI *_twitter = [STTwitterAPI twitterAPIWithOAuthConsumerKey:ConsumerKey consumerSecret:ConsumerSecret username:UserName password:Password]; [_twitter fetchAndFollowCursorsForResource:@"search/tweets.json" HTTPMethod:@"GET" baseURLString:@"https://api.twitter.com/1.1" parameters:@{@"q":query} uploadProgressBlock:nil downloadProgressBlock:nil successBlock:^(id request, NSDictionary *requestHeaders, NSDictionary *responseHeaders, id response, BOOL morePagesToCome, BOOL *stop) { // 検索結果の正常受信 NSDictionary *json = (NSDictionary *)response; } pauseBlock:^(NSDate *nextRequestDate) { // ロード中 } errorBlock:^(id request, NSDictionary // エラー }];
3 ウインドウ
透明のWindowは、色々と扱いにくいので、アプリケーションを常に最前面に表示するようにして、非アクティブになった時だけ透過するようにしました。 なので、アクティブにすると、普通のアプリのように、拡大縮小や位置の変更などが可能になります。
(1) 最前面表示
ウインドウを常に最前面に置くためのコードは、次のとおりです。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { // ウインドウ最前面 NSWindow *window = [[NSApp windows]objectAtIndex:0]; [window setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces | NSWindowCollectionBehaviorFullScreenAuxiliary]; [window setLevel: NSFloatingWindowLevel]; }
(2) ウインドウ透過
透明のウインドウ(NSWindow)は、setBackgroundColorで背景色をclearColor(透過)にセットし、併せてsetOpaque及び、setHasShadowにNOに設定することで作成することができます。
ただし、その上に存在する全てのビューも同時に透過に設定する必要があります。 本プログラムでは、テーブルビュー及びその下に存在するすスクロールビューも透過す設定しています。
- (void)viewDidLoad { ・・・省略・・・ // ウインドウ透明 NSWindow *window = [[NSApp windows]objectAtIndex:0]; [window setOpaque:NO]; [window setBackgroundColor : [ NSColor clearColor ]]; [window setHasShadow:NO]; _scrollView.drawsBackground = NO; [_tableview setBackgroundColor:[NSColor clearColor]]; [_tableview setHeaderView:nil]; self.view.alphaValue = 0;
そして、プログラムがアクティブになった時と、非アクティブになった時に、次の処理を入れています。
// プログラムがアクティブになった時 - (void)applicationWillBecomeActive:(NSNotification *)notification{ NSLog(@"willBecomeActive"); NSWindow *window = [[NSApp windows]objectAtIndex:0]; [window setStyleMask:NSTitledWindowMask|NSResizableWindowMask|NSClosableWindowMask];// タイトル表示 [window setBackgroundColor : [ NSColor lightGrayColor ]]; } // プログラムが非アクティブになった時 - (void)applicationWillResignActive:(NSNotification *)notification{ NSLog(@"willResignActive"); NSWindow *window = [[NSApp windows]objectAtIndex:0]; [window setStyleMask:NSBorderlessWindowMask];// タイトル非表示 [window setBackgroundColor : [ NSColor clearColor ]]; }
(3) フォントの拡大縮小
最終的な目的が、プレゼン資料の上での表示なので、会場で文字が読める大きさであるかどうかは重要な問題です。 できるだけ沢山のTweetを表示して、かつ、見やすい大きさに調整できるように、キー操作でフォントの拡大縮小ができるようになっています。
// キー入力でフォントの拡大・縮小を行う - (void)keyDown:(NSEvent *)theEvent { switch([[theEvent characters] characterAtIndex:0]) { case '+': // フォント拡大 self.fontSize += 1; break; case '0': // フォント縮小 self.fontSize -= 1; break; } [_tableview reloadData]; }
4 最後に
今回は、透過型アプリの作成となりましたが、予想以上に美しい出来栄えで、ビックリしています。 また、何か他のものにも挑戦してみたいと思いました。