UIAppearance で色や画像を変える

2011年10月31日月曜日 | Published in | 2 コメント

このエントリーをはてなブックマークに追加

UIAppearanceプロトコル


iOS5 から UIAppearance プロトコルが導入された。このプロトコルを使うと UINavigationBar や UISwitch のインスタンスの色を変更することができる。変更の仕方はこんな感じ。
[[UISwitch appearance] setOnTintColor:[UIColor greenColor]];
UIAppearance が有用なのは、上記の通りインスタンスではなくクラスに対して色設定ができること。つまりこれを使うと画面上で使われているすべての UISwitch の色を変えることができる。

例えば緑基調の画面があったとして、UIAppearance プロトコルを使うと別の色(例では赤)に変更することができる。
上記の例は1画面だけだが、アプリで使われるすべての画面で色が変わる。

上記例の色変更の箇所のコードはこんな感じ。
UIColor* color = nil;
    if (index == 0) {
        color = [UIColor colorWithRed:0 green:0.5 blue:0 alpha:1.0];
    } else {
        color = [UIColor colorWithRed:0.5 green:0 blue:0 alpha:1.0];
    }
    [[UINavigationBar appearance] setTintColor:color];
    [[UISegmentedControl appearance] setTintColor:color];
    [[UIProgressView appearance] setProgressTintColor:color];
    [[UISlider appearance] setMinimumTrackTintColor:color];
    [[UISwitch appearance] setOnTintColor:color];
    [[UIActivityIndicatorView appearance] setColor:color];
    [[UITabBar appearance] setTintColor:color];

UIAppearanceを使うとコントロール自体の基本色を実行中に切り替える事ができる。


所属ビューの限定


そのビューが所属している親ビューを条件に指定することができる。例えば UINavigationBar に配置されている UIBarButtonIem だけ色を変えたい場合は appearanceWhenContainedIn: を使ってこう書く。
[[UIBarButtonItem appearanceWhenContainedIn:
    [UINavigationBar class], nil] setTintColor:color];
親クラスは複数指定することができる。

appearance と appearanceWhenContainedIn: を比べた例。
[[UIBarButtonItem appearance] setTintColor:color];
この場合、UINaigationBar と UIToolBar 上の UIBarButtonItem の色が共に変更されている。

これを UINavigatorBar 限定にしてやるとこうなる。
[[UIBarButtonItem appearanceWhenContainedIn:
    [UINavigationBar class], nil] setTintColor:color];



サブビューへの適用


UINavigationBar や UIToolBar の色を変えるとそのサブビューである UIButtonBarItem の色も変更される。

[[UINavigationBar appearance] setTintColor:color];

ボタンを別の色に変えたい場合は明示的に指定してやる。
[[UINavigationBar appearance] setTintColor:color];
[[UIBarButtonItem appearance] setTintColor:blueColor];


UILabel


UILablel の文字色を変えると UITextField や UIButton の文字色も変わる。

これは UIButton 等が文字表示の為に UILabel をサブビューとして持っている為(例えば UIButton の場合、UIButtonLabel::UILabel を使っている)。UIButton の他にも UITextField が UISearchBar で使われていたりと他のコントロールを内包しているケースが多々ある。この為、UILabel や UItextField など基本的なパーツを使う場合は注意が必要。


ビュー階層内の優先順位


サブビューの設定が優先される。例えば UINavigationBar と UIBarButtonItem の両方で tintColorを設定した場合、UIBarButtonItem はそれ自身に設定した色のが優先される。
[[UINavigationBar appearance] setTintColor:color];
[[UIBarButtonItem appearance] setTintColor:blueColor];
呼び出し順は関係ないので逆にしてもこれは変わらない。
[[UIBarButtonItem appearance] setTintColor:blueColor];
[[UINavigationBar appearance] setTintColor:color];


画像の切替


UIAppearance による切替は色に限らず他の属性にも適用できる。例えば背景画像の切替をやって見る。
if (index == 0) {
        backImage = [UIImage imageNamed:@"back1.png"];
    } else {
        backImage = [UIImage imageNamed:@"back2.png"];
    }

    [[UIButton appearance] setBackgroundImage:backImage forState:UIControlStateNormal];

ボタンを画像で用意している場合や、ビューにテクスチャを貼っている場合など、あらかじめ複数種類の画像セットを用意しておけば簡単に切替ができる。


UIView


UIAppearanceプロトコル適用の宣言は UIView で行われている。
UIKIT_CLASS_AVAILABLE(2_0) @interface UIView : UIResponder
  <NSCoding, UIAppearance, UIAppearanceContainer> {
  :
この為、UIView の appearance に対して設定を行うと画面に表示されるすべてのビューに対して変更が適用される。例えば
[[Uiview apperance] setbackgroundcolor:[UIColor whitecolor]];
とすると、こうなる。


実際のデザインよりはデバッグ目的での利用が多そう。


備考


色を設定した後の再描画方法がわからなかった。-[UIView setNeedsDisplay] を performSelector:@selector(setNeedsDisplay)object:delay: を使ってみたがうまくいかなかった。この理由によりサンプルでは下のタブバーの色だけが切り替わらない。※もしご存知の方がいたら是非教えて下さい。


サンプル


検証に使ったサンプルソースはこちら。
UIAppearanceSample at 2011-10-31 from xcatsan/iOS5-Sample - GitHub



- - - -

スキンの切替が容易に実現できるので今後重宝しそう。

今週のCocoa情報まとめ(2011-10-23発行)

2011年10月30日日曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

久々に。


ライブラリ


iVersion for iOS - Cocoa Controls


新バージョンがダウロード可能になったらダイアログを表示する機能や、初回起動時にアップデート内容を表示する機能を持つ。



開発 - 情報


GLKitの基本 | なんてこったいブログ


GLKit の概要がよくわかる記事。
以下引用。
  • iOS 5で追加されたフレームワーク
  • OpenGLアプリケーションを作るとき用
  • 今までiPhoneでOpenGLアプリケーションを作るときに不便だった部分を補完してくれる


5 helpful UIKit features in the iOS 5 SDK | Think Vitamin

iOS 5 から UIAppearance が追加され、アピアランスセットの切替ができるようになったらしい。これはいい。


モバイルウェブ環境のHTTPSのチューニング « NAVER Engineers' Blog

良いまとめ。NSURLConnectionにおけるKeepaliveの問題への言及もあり。


iOS 5 SDK: UIAlertView Text Input and Validation

iOS 5 から UIAlertView にテキスト入力フィールドを追加することができるようになった。


StoreKitと闘う | なんてこったいブログ

StoreKit の解説。

既に何回か投稿されていて詳細に解説されている。
StoreKitの正常な決済の流れ | なんてこったいブログ
プロダクト情報の取得 | なんてこったいブログ
StoreKitの支払いリクエストの作成と購入手続きの開始まで | なんてこったいブログ

関連情報など
アプリ内ストアの定期購読型(Auto-renewable Subscriptions)に関するメモ / 2011-10-28 - iRSSの日記
新しい定期購読型のアプリ内課金を実装してみた (Auto-renewable Subscriptions) | KRAY Inc


Newsstandメモ / 2011-10-26 - iRSSの日記

iOS5 から導入された Newsstand の開発情報。


開発 - 環境


Objective-C用のドキュメント作成ツールappledoc | なんてこったいブログ
appledocのGUIフロントエンドを作りました | なんてこったいブログ

Apple が提供しているリファレンスデザインそっくりのドキュメントを生成するコマンドラインツール appledoc の紹介記事。

appledoc の出力はこんな感じ。

まんま Apple のそれに近い。


[Xcode][iOS] Xcode 4.2にiOSシミュレータ4.3をインストールする - iOS 開発ブログ Natsu's note

以前のバージョンのシミュレータを動作させるには Xcode の Preferences - Download でダウンロードする必要あり。

(関連情報)Xcode Release Notes


Xcode 4.2で変わったビルド設定(アーキテクチャとコンパイラ)と問題点などについて - Awaresoft

以下、勝手なまとめ
  • arm6 の非サポートの件(デフォルト arm7)
  • コンパイラの変更(LLVM GCC 4.2 と Apple LLVM Compiler 3.0 の二択。後者がデフォルト)
  • LLVMコンパイラの問題(Apple LLVM Compiler 3.0 でコンパイルした場合起動せずクラッシュしたケースなど)
  • アーキテクチャ毎に異なるコンパイラを使用する方法の紹介


iPhone/iPad向けObjective-C開発環境「AppCode」登場 - JetBrains | エンタープライズ | マイコミジャーナル

Objective-C向けの統合開発環境。Eclipseベース(要Javaランタイム)。




開発 - デバッグ


iOSデバイスのクラッシュログを読むには - Awaresoft

.dSYMファイルとシンボル解決用スクリプト symbolicatecrash の説明など。クラッシュ状況や原因究明を調べるのに役立つ情報。
以下、引用
この場所にパスが通っていない場合は、パスに追加しておくか、パスが通っている場所にスクリプトをコピーするかしておくとよろしいかと思います。
  • クラッシュログファイル(*.crash)
  • dSYMファイル
  • symbolicatecrashスクリプト
の3つがそろったら、ターミナルから次のコマンドを実行すると、シンボルを解決した結果がコンソールに出力されます。
% symbolicatecrash [クラッシュログファイル] [dSYMファイル]

Xcode 4.2 + armv6で浮動小数点のバグ | HMDT Blog

以下、引用
Xcode 4.2 + armv6デバイスの組み合わせで、浮動小数点の演算にバグがあるらしい。演算結果が正しくないときがあるらしい。


Cocoaの日々


Cocoaの日々: CAGradientLayer を使ったグラデーション付きボタンの試作




Cocoaの日々: github の pull request

github の pull request とは、 fork したソースの修正を master ブランチへ反映させる為の仕組み。修正者が master のメンテナへリクエストを出す。それを受けたメンテナは内容を確認してマージを行う。github の pull request は、この一連の流れが全部 Webブラウザだけでできる。


github の pull request

2011年10月27日木曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

先日投稿した記事のソースコードに @griffin_stewie さんから pull request をいただいた。

Cocoaの日々: CAGradientLayer を使ったグラデーション付きボタンの試作

GradientButton at 2011-10-22 from xcatsan/iOS-Sample-Code - GitHub

github の pull request とは、 fork したソースの修正を master ブランチへ反映させる為の仕組み。修正者が master のメンテナへリクエストを出す。それを受けたメンテナは内容を確認してマージを行う。github の pull request は、この一連の流れが全部 Webブラウザだけでできる。

今回の場合のやりとりはこんな感じ。
@xcatsan : IOS-Sample-Code/GradientButton 作成
  ↓
@griffin_stewie : IOS-Sample-Code を fork, GradientButton を修正し、pull request 発行→メール飛ぶ
  ↓
@xcatsan: pull request を確認し、マージ

github は pull request 用にユーザが意見交換できるような画面を用意していて、これを使って対話的に作業を進めていくことができる。以下、スクリーンショットを紹介しておく。

pull request 画面

その場で修正点が確認できる

マージボタンが表示される

コメントを入れて最後にボタン一発でマージ完了

画面が更新されてこんな風になる



- - - -
griffin_stewie さん、パッチ&協力ありがとうございました。
それにしても github は良くできてる。UI も洗練されていて綺麗だし使いやすい。



application:didFinishLaunchingWithOptions: 覚書き

2011年10月26日水曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

application:didFinishLaunchingWithOptions: に関する覚書き。

呼び出し順序


下記の順で呼ばれる。

application:didFinishLaunchingWithOptions:
 ↓
application:handleOpenURL:


options


application:didFinishLaunchingWithOptions: の引数には通常 nil が渡ってくるが、他のアプリから呼び出した場合は NSDictionary が渡される。渡される情報(キー)は次の通り。
NSString *const UIApplicationLaunchOptionsURLKey;
NSString *const UIApplicationLaunchOptionsSourceApplicationKey;
NSString *const UIApplicationLaunchOptionsRemoteNotificationKey;
NSString *const UIApplicationLaunchOptionsAnnotationKey;
NSString *const UIApplicationLaunchOptionsLocalNotificationKey;
NSString *const UIApplicationLaunchOptionsLocationKey;
NSString *const UIApplicationLaunchOptionsNewsstandDownloadsKey;
UIApplication Class Reference
iOS 5 からは Newsstand 関連の情報が追加されている。

以下は Safari からアプリを呼び出した例。※見やすい様に改行が入れてある
{
     UIApplicationLaunchOptionsSourceApplicationKey = "com.apple.mobilesafari";
     UIApplicationLaunchOptionsURLKey = 
                "jp.lakesoft.Test://sample/?id=dbebd9d29e612965a9f83d2a2e160d";
 }


参考情報


Document Interaction Programming Topics for iOS: Opening Supported File Types


- - - -
application:handleOpenURL: を使わなくても他アプリから渡されたURLが処理できるのか。




CAGradientLayer を使ったグラデーション付きボタンの試作

2011年10月22日土曜日 | Published in | 4 コメント

このエントリーをはてなブックマークに追加

CAGradientLayer を使った描画がしたくて調べている。試しにボタンを作ってみた。


仕組み


UIControl をベースのクラスに使い、その上にレイヤーを重ねて作ってある。
基本の色は UIControl.backgroundColor で決める。

その上に CAGradientLayer をかぶせてグラデーションをかける。グラデーションは白色をアルファ値を変えて表現する。
self.gradientLayer = [CAGradientLayer layer];
    self.gradientLayer.frame = self.bounds;
    self.gradientLayer.locations = [NSArray arrayWithObjects:
                                    [NSNumber numberWithFloat:0.0],
                                    [NSNumber numberWithFloat:0.5],
                                    [NSNumber numberWithFloat:0.5],
                                    [NSNumber numberWithFloat:1.0],
                                    nil]
     self.gradientLayer.colors =
        [NSArray arrayWithObjects:
             (id)[UIColor colorWithWhite:1.0 alpha:0.7].CGColor,
             (id)[UIColor colorWithWhite:1.0 alpha:0.4].CGColor,
             (id)[UIColor colorWithWhite:1.0 alpha:0.3].CGColor,
             (id)[UIColor colorWithWhite:1.0 alpha:0.0].CGColor,
             nil];
    [self.layer addSublayer:self.gradientLayer];
こうするとベースの色(UIControl.backgroundColor)は単純に基本の色を指定するだけで良い。色を加工したり、あらかじめ色のグラーでションを用意する必要が無いので使い勝手がいい(と思う)。

その上にボタンの文字を CATextLayer に描く。
self.textLayer = [CATextLayer layer];
    self.textLayer.string = self.text;
    self.textLayer.font = CGFontCreateWithFontName((CFStringRef)[self _font].fontName);
    self.textLayer.fontSize = [self _font].pointSize;
    self.textLayer.truncationMode = kCATruncationEnd;
    self.textLayer.alignmentMode = kCAAlignmentCenter;
    self.textLayer.shadowColor = [UIColor blackColor].CGColor;
    self.textLayer.shadowRadius = 0.5;
    self.textLayer.shadowOffset =CGSizeMake(-0.5, -0.5);
    self.textLayer.shadowOpacity = 0.5;
    self.textLayer.foregroundColor = [UIColor whiteColor];
    [self.layer addSublayer:self.textLayer];

その上のレイヤーはボタンに立体感を出すためのハイライトライン。
これを描くために CALayer のサブクラス HighlightEdgeLayer を作り自前で線を描画している。
#define CORNER_RADIUS   5.0

@implementation HighlightEdgeLayer
- (void)drawInContext:(CGContextRef)context
{
    CGMutablePathRef path = CGPathCreateMutable();
    CGPoint p = CGPointMake(CORNER_RADIUS, CORNER_RADIUS);

    CGPathAddArc(path, NULL,
                 p.x, p.y,
                 CORNER_RADIUS,
                 2.0*M_PI/2.0,
                 3.0*M_PI/2.0,
                 false);

    p.x = self.bounds.size.width - CORNER_RADIUS;
    CGPathAddArc(path, NULL,
                 p.x, p.y,
                 CORNER_RADIUS,
                 3.0*M_PI/2.0,
                 4.0*M_PI/2.0,
                 false);

    CGContextAddPath(context, path);
    CGPathRelease(path);
    CGContextSetStrokeColorWithColor(context, [UIColor colorWithWhite:1.0 alpha:0.5].CGColor);
    CGContextSetLineWidth(context, 1.0);
    CGContextDrawPath(context, kCGPathStroke);

}
@end
一番上のレイヤーは UIControl に最初からついている CALayer。これで黒い境界線を引き、角を丸くしている。
self.layer.cornerRadius = CORNER_RADIUS;
    self.layer.masksToBounds = YES;
    self.layer.borderColor = [UIColor colorWithWhite:0.0 alpha:0.75].CGColor;
    self.layer.borderWidth = 1.0;

ボタンが押された時には -[UIControl setHighlighted:] が呼ばれるのでここでグラデーションの色を変えてやる。
- (void)setHighlighted:(BOOL)highlighted
{
    [super setHighlighted:highlighted];
    [self _setState:highlighted ? GradientButtonStateHighlighted : GradientButtonStateNormal];
}
サンプルでは3つの状態を定義しておいて、それぞれでグラデーションの色と文字色を変えている。
typedef enum {
    GradientButtonStateNormal = 0,
    GradientButtonStateHighlighted,
    GradientButtonStateDisabled
} GradientButtonState;

- (void)_setState:(GradientButtonState)state
{
    switch (state) {
        case GradientButtonStateNormal:
            self.gradientLayer.colors =
            [NSArray arrayWithObjects:
             (id)[UIColor colorWithWhite:1.0 alpha:0.7].CGColor,
             (id)[UIColor colorWithWhite:1.0 alpha:0.4].CGColor,
             (id)[UIColor colorWithWhite:1.0 alpha:0.3].CGColor,
             (id)[UIColor colorWithWhite:1.0 alpha:0.0].CGColor,
             nil];
            self.textLayer.foregroundColor = self.textColor.CGColor;
            break;
            
        case GradientButtonStateHighlighted:
            self.gradientLayer.colors =
            [NSArray arrayWithObjects:
             (id)[UIColor colorWithWhite:1.0 alpha:0.5].CGColor,
             (id)[UIColor colorWithWhite:1.0 alpha:0.2].CGColor,
             (id)[UIColor colorWithWhite:0.0 alpha:0.05].CGColor,
             (id)[UIColor colorWithWhite:0.0 alpha:0.1].CGColor,
             nil];
            self.textLayer.foregroundColor = self.textColor.CGColor;
            break;
            
        case GradientButtonStateDisabled:
            self.gradientLayer.colors =
            [NSArray arrayWithObjects:
             (id)[UIColor colorWithWhite:1.0 alpha:0.7].CGColor,
             (id)[UIColor colorWithWhite:1.0 alpha:0.4].CGColor,
             (id)[UIColor colorWithWhite:1.0 alpha:0.3].CGColor,
             (id)[UIColor colorWithWhite:1.0 alpha:0.0].CGColor,
             nil];
            self.textLayer.foregroundColor = [UIColor lightGrayColor].CGColor;
            break;
    }
}
押す前

押した後
ディゼーブル


サンプル


何色かのボタンを並べたサンプルを作ってみた。最後のボタンは Disable状態。
ベースの色は階調が見やすいように濃いめの色にした方がいい。これはグラデーションの表現を白で表現している為。標準で UIColor に用意されている greenColor や yellowColor は明るすぎて階調が出づらい。

Xib はこんな感じ。UIView を配置して大きさを調整した後、クラスに GradientButton を指定する。


利用上の注意点としては Xib 上で IBAction を指定すると Value Changed のアクションがデフォルトで選択される。これではボタン押下時のイベントが取れないので Touch up inside を使う。


ソースコード


GitHub からどうぞ。
GradientButton at 2011-10-22 from xcatsan/iOS-Sample-Code - GitHub


参考情報


テン*シー*シー - 【iPhoneアプリ開発ドリル】Aqua風ボタンを作る

CAGradientLayer の使い方はこのサイトがとても参考になった。UIControl をボタンとして実装するアイディアはここから拝借した。情報をどうも!

iPhoneアプリ開発、その(17) 文字だって回転|テン*シー*シー

CATextLayer の使い方もここ。

iphone - How can i convert UIFont to CGFontRef?I causes warning and not working - Stack Overflow

UIFont から CGFontRef を取る方法。
CGFontRef cgFont = CGFontCreateWithFontName((CFStringRef)uiFont.fontName);

サンプルコードのボタンのグラデーション(ハイライト)は iOS のポップアップメニューを参考にした。


なので通常のボタンと見た目がちょっと違う。


関連情報


CATextLayer Class Reference
CAGradientLayer Class Reference


このエントリーをはてなブックマークに追加

Xcode 4.2 のオーガナイザで実機内のフォルダが見られるようになっていた。
以前はいちいちスナップショット(ZIP)をダウンロードして展開しないと駄目だったと思うのでこれは便利。


iOS5 では UIViewController.parentViewController が nil

2011年10月17日月曜日 | Published in | 4 コメント

このエントリーをはてなブックマークに追加

(2011-10-18追記)その後の調査で、下記のことがわかった。

  • Xcode 4.1 でビルドしたアプリを iOS5 で動作させても現象はでない
  • Xcode 4.2 でビルドしたアプリを iOS5 で動作させると現象が出る


iOS 5.0 から UIViewController.parentViewController が親の UIViewController を返さなくなった。手元のプログラムで iOS4.3 までは入っていたこのプロパティが、iOS 5.0 では nil になっていた。親は UITabBarController。
/*
If this view controller is a child of a containing view controller (e.g. a navigation controller 
or tab bar controller,) this is the containing view controller.  Note that as of 5.0 this no 
longer will return the presenting view controller.
*/
@property(nonatomic,readonly) UIViewController *parentViewController;

5.0 では新しく追加された presentingViewController を使う。
// The view controller that was presented by this view controller
  or its nearest ancestor.
@property(nonatomic,readonly) UIViewController *presentedViewController  
    __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);

presentModalViewController で表示された ViewController が自分自身を閉じる場合、例えば iOS4.3 までだと下記のようなコードが書けた。
[self.parentViewController dismissModalViewControllerAnimated:YES];

iOS 5 の場合、parentViewController が nil になるので代わりに presentingViewController を使う。両バージョンで動作させる場合はこんな感じ。
if ([selfrespondsToSelector:@selector(presentingViewController)]) {
        [self.presentingViewControllerdismissModalViewControllerAnimated:YES];        
} else {
        [self.parentViewControllerdismissModalViewControllerAnimated:YES];
}

他にはこんなのもある。
// The view controller that was presented by this view controller
 or its nearest ancestor.
@property(nonatomic,readonly) UIViewController *presentedViewController  
    __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);

TWTweetComposeViewController でツィート

2011年10月15日土曜日 | Published in | 7 コメント

このエントリーをはてなブックマークに追加

iOS 5 から Twitter投稿用の API が追加された。前から興味があったので試してみた。
TWTweetComposeViewController Class Reference

(2012/02/24追記あり) 

使い方


プロジェクトへフレームワークを追加しておく。

使いかたはこんな感じ。
#import <Twitter/TWTweetComposeViewController.h>

    TWTweetComposeViewController *viewController =
        [[TWTweetComposeViewController alloc] init];

    [viewController setInitialText:@"Initial String"];
    [viewController addImage:image];
    [viewController addURL:[NSURL URLWithString:@"http://www.apple.com/"]];

    viewController.completionHandler = ^(TWTweetComposeViewControllerResult res) {
        if (res == TWTweetComposeViewControllerResultDone) {
            NSLog(@"done");
               :
        } else if (res == TWTweetComposeViewControllerResultCancelled) {
            NSLog(@"cancel");
              :
        }
    };
    
    [self presentModalViewController:viewController animated:YES];
}
5分もかからない、コピペすれば数秒。iOS5以前の苦労がウソのような超簡単さ....。

presentModalViewController:viewController: で表示すると専用の投稿画面が立ち上がる。この画面はローカライズされていないようだ。
(2012/02/24追記) Storyboardもしくは呼び出し元のビューをローカライズすると、この画面もそれに合わせた言語になるとのこと。情報提供された方 Thanks!

また位置情報を追加することもできる。
Send を押すと投稿されて画面が閉じられる。この時、鳥のさえずり効果音も鳴る。

投稿もしくはキャンセルされると completionHandler が呼び出される。リファレンスによれば現在のスレッドで処理が実行されるようだ(別スレッドにはならない)。
Note that completion handlers are not called on any particular thread.

また UIPopoverController では使えないとのこと。
Warning: You cannot use an UIPopoverController object to present a TWTweetComposeViewController object.

利用可能かどうかを確認する為のクラスメソッドも用意されている。
// Returns if Twitter is accessible and at least one account has been setup.
+ (BOOL)canSendTweet;
iOS のTwitter設定でアカウントが登録されていない場合、NO が返る。

アカウント未登録状態で投稿画面を呼び出すとダイアログが表示される。
ここは日本語化されていないようだ。
Settings を押すと iOS の Twitter設定画面が開かれる。設定後にアプリを起動するとこのダイアログが消えた状態で復帰する。


サンプル


GitHub からどうぞ。
TweetSample at master from xcatsan/iOS5-Sample - GitHub

起動するとテキストビューが表示される。add image ボタンを押すと。カメラロールからイメージが追加できるようになっている。

投稿結果の例




備考


addImage: に複数画像を追加しても最初の一枚しか投稿されなかった。結果の BOOL値を確認したところ、2枚目以降は必ず NO が帰っていた。原因は不明。


参考情報


iOS5.0のTwitter APIを使って文字や画像をTweetする方法(TWTweetComposeViewController) - あらきんぐのiPhoneアプリ開発ブログ


ld: library not found for -lz.1.2.3 と出たら

| Published in | 0 コメント

このエントリーをはてなブックマークに追加

Xcode 4.1 で iOS 4.3 向けに開発していたアプリを Xcode 4.2 で iOS 5 の実機用にビルドしたら下記のエラーが出た。
ライブラリがみつからないとのこと。該当ファイルが赤い表示(ファイル不在)になっている。

iOS 5 になってライブラリのバージョンが上がったのが原因のようだ。この場合はリンクするライブラリを変更してやればいい。ターゲットを選び "Builde Phases" の "Link Binary With Libraries" で適切なバージョンのライブラリを指定してやる。
iOS 5 になって libz の 1.2系は 1.2.3 から1.2.5 にバージョンアップされたようだ。iOS 5 向けだけにアプリをリリースするのであれば 1.2.5 を選べばいいが、iOS 4.3 もサポートするのであればそれはまずい。この場合、シンボリックリンクである libz.1.dylib か libz.dylib を選ぶといい。

この後、Deployment Target を iOS 4.3 としてビルドしたコードは、iOS 4.3 と iOS 5.0 の実機で動作した。
他のライブラリでも同様の問題が出たら同じ様に直せば良いだろう。

人気の投稿(過去 30日間)