Evernote iOS SDK OAuth でログイン前の白い画面にインジケータを表示


Evernote iOS SDK OAuth でログイン前まえに、ログインのWebページがロードされるまでに時間があって、この間白い画面になってしまうのが気になる。

ATOK Padではちゃんと黒い背景にインジケータを表示していた。
どうやっているのだろうか?

SDK の internal/ENOAuthViewController.m で UIWebView を呼び出しているので、ここでやっているのではなかろかと思う。とりあえず以下のようにしてみた。

1)背景用のインスタンスを準備

@property (nonatomic, retain) UIView* indicatorBgView;
@synthesize indicatorBgView = indicatorBgView_; 

2)viewWillAppearを追加して、インスタンスをaddSubview

- (void)viewWillAppear:(BOOL)animated
{
    if (indicatorBgView_ == nil) {
        indicatorBgView_ = [[UIView alloc] initWithFrame:self.webView.bounds];
        indicatorBgView_.backgroundColor = [UIColor blackColor];
        [self.webView addSubview:indicatorBgView_];
        UIActivityIndicatorView* indicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0,50, 50)];
        indicator.center = indicatorBgView_.center;
        indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
        [indicatorBgView_ addSubview:indicator];
        [indicator startAnimating];
        [indicator release];
    }
    [super viewWillAppear:animated];
}

3)UIWebViewDelegate のwebViewDidFinishLoadを追加して、インスタンスを消去

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{
    if (indicatorBgView_ != nil) {
        [indicatorBgView_ removeFromSuperview];
        [indicatorBgView_ release];
        indicatorBgView_ = nil;
    }
}

カスタマイズしたUITableViewCell内でdrawRectを使うときの delete モードの制御


カスタマイズしたUITableViewCellのdrawRect内で自分でいろいろ描画する場合、editing(編集モード)になった時に、削除アイコンなどのための左右のマージンは自分で制御しなければならない。

「編集」ボタンをタップして編集モードにした場合は、self.editing で取得でモードの変化を取得きるが、この時にさらにdelete ボタンを表示させたときの状態の取得には別の方法が必要だ。

つまり、編集モードになったときは 左の(−)アイコン分の左マージンを自分で作り、さらにこれをタップしてdeleteボタンが表示されたときにはその分の右マージンを自分で追加しなければならない。

さらに編集モードではなく、スワイプしてdeleteボタンを表示した場合も考えなければならない。この場合はこの行だけが editingモードになるが但し左のマージンは必要ない((−)アイコンは表示されない)。そしてdeleteボタン分の右側マージンだけが必要になる。この事態は self.editing では判定できない。

なにか単純な方法で判定できないだろうかと検索。
stackoverflow の “iPhone UITableView – Delete Button” が参考になった。
– (void)willTransitionToState:(UITableViewCellStateMask)state というのが使えるようだ。

以下のように状態取得を組み込んでおいて、drawRectの中では editingStyleEdit_==YES のときは左にマージン、editingStyleDelete_ == YES のときは右にマージンを作るようにした。

- (void)willTransitionToState:(UITableViewCellStateMask)state {
    [super willTransitionToState:state];
    editingStyleDelete_ = NO;
    editingStyleEdit_ = NO;
    if (UITableViewCellStateShowingDeleteConfirmationMask == (state & UITableViewCellStateShowingDeleteConfirmationMask)) {
        editingStyleDelete_ = YES;
    }
    if (UITableViewCellStateShowingEditControlMask == (state & UITableViewCellStateShowingEditControlMask)) {
        editingStyleEdit_ = YES;
    }
    [self setNeedsDisplay];
}