2012年8月アーカイブ


iOSアプリを開発するときに欠かせないのが UIScrollView

こいつにまかせておけば、いい感じにスクロール処理をしてくれる。

でも、コンテンツがスクロールせずに収まる大きさの場合スクロールしない。

微動だにしない。

当然といえば当然だ。

だが、希望としては、コンテンツが小さいときも、あの跳ね返るようなビヨヨヨーン、って動きはやってほしい。

コンテンツの数によって挙動が異なるとUI的には違和感がある。

そこで以下のようなコードで、コンテンツが小さいときもビヨーンってなるようにしました。

scrollView.contentSize = CGSizeMake(scrollView.frame.size.width,scrollView.frame.size.height+1) ;

こうすることで、UIScrollView はスクロールする必要があると判断し、ビヨーンってしてくれます。

ただ、上スクロールしたときに、1ピクセル上で止まってしまうのでそこは注意。

あと、コンテントサイズがスクロールビューより多いきときはそのまま高さに指定してください。

if(contentHeight <= scrollView.frame.size.height){
    contentHeight = scrollView.frame.size.height + 1 ;
}
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width,contentHeight) ;

な感じでしょうか。


Windows系のエディタだと、複数行を選択してTABキーを押すと一括してインデントを入れてくれるものが多いが、Xcodeでそれをやると選択した行が消えてしまう(TAB1個になる)。

どうしたもんかといろいろと探していたら

Command + ]

でインデントが入れられることがわかった。

減らすときは

Command + [

これで楽になる。


viewDidAppear で以下のようなアニメーション処理を書いたが、アニメーションせずにいきなり画像が変わってしまう。

- (void)viewDidAppear:(BOOL)animated
{
    [UIView beginAnimations:nil context:nil] ;
    [UIView setAnimationDuration:1.0] ;
    [UIView setAnimationDelegate:self] ;
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:imageView cache:YES] ;
    [imageView setImage:[UIImage imageNamed:imageName]] ;
    [UIView commitAnimations];
}

どうやら viewDidAppear 内ではNGなようなので、ちょっと時間差をつけて処理するようにしてみた。
以下のようなコード

- (void)viewDidAppear:(BOOL)animated
{
    [self performSelector:@selector(flipImage) withObject:nil afterDelay:0.1f];
}

- (void)flipImage
{
    [UIView beginAnimations:nil context:nil] ;
    [UIView setAnimationDuration:1.0] ;
    [UIView setAnimationDelegate:self] ;
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:imageView cache:YES] ;
    [imageView setImage:[UIImage imageNamed:imageName]] ;
    [UIView commitAnimations];
}

無事、アニメーションしました。


In-App Purchase のテストをしていたらサーバ側のサンドボックス環境で以下のエラーが出るようになった。

SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

どうやら、SSL関係の証明書のどれかがおかしい(期限切れ?)らしい。

とりあえずCURLのオプションで

curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0) ;
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0) ;

を指定して回避。

サンドボックスのみの現象で、本番環境ではオプション付けなくても問題無く動作している。



XCode 4.2 から XCode 4.4.1 にアップデートしたらビルドでエラーが出るようになった。

"Missing context for method declaration" というエラーが出る。
読んで字のごとくヘッダでメソッドを宣言していないのかと思い、ヘッダを見てみるも、ちゃんと宣言が書かれている。

もうひとつ別のヘッダで "Missing @end" というエラーが出ている。
ヘッダを見てみると単純に
@interface SomeClass : NSObject {
    BOOL isFinished ;
}
- (void)someMethod ;
@end

のような記述で @end もちゃんと書いてある。

悩んだ結果原因は、とあるソースの @implementation 中に #import 文を入れていることでした。

以下のような感じ

@implementation aaa
  :
  :
#import "bbb.h" // <- このヘッダで Missing @end エラーが出る
  :
+ (void)something // <- このメソッドが Missing context for method declaration エラーとなる
{
}
@end

ということで対策は、#import "bbb.h" を@implementation の外(上)に出すようにしました。

このアーカイブについて

このページには、2012年8月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2012年7月です。

次のアーカイブは2012年9月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 5.13-ja