twitterウィジェットを貼り付けようとしてハマった

同じ名前でツイッターもやってるのでせっかくだからサイドバーに貼ってみよう!

ということでやってみたらハマったのでメモ。


まずは貼り付けるウィジェットTwitter公式サイトからもらいます。
https://twitter.com/about/resources/widgets


自分のツイートを出したい時はプロフィールを選びます。
色々カスタマイズして最後にコード取得ってやるとスクリプトを吐いてくれます。

で、はてなのデザイン編集画面でサイドバーのパーツのリストからブログパーツ
選んでそこにさっき取ってきたスクリプトを貼り付ければ完了!


…のはずがうまくいかない。
なんにも出てこないし編集画面でも追加された気配がない。

結論としては、吐き出してるスクリプトがイケてないせいで上手くいってないらしい。
もらってきたスクリプトがこれ。

<script src="http://widgets.twimg.com/j/2/widget.js"></script>
<script>
new TWTR.Widget({
  version: 2,
  type: 'profile',
  rpp: 4,
  interval: 30000,
  width: 'auto',
  height: 300,
  theme: {
    shell: {
      background: '#333333',
      color: '#ffffff'
    },
    tweets: {
      background: '#ffffff',
      color: '#000000',
      links: '#555555'
    }
  },
  features: {
    scrollbar: true,
    loop: false,
    live: true,
    behavior: 'all'
  }
}).render().setUser('azukinohiroki').start();
</script>

で、うまくいったのはこれ。

<script src="http://widgets.twimg.com/j/2/widget.js"></script>
<script>
new TWTR.Widget({
  version: 2,
  type: 'profile',
  rpp: 4,
  interval: 30000,
  width: 'auto',
  height: 300,
  theme: {
    shell: {
      background: '#333333',
      color: '#ffffff'
    },
    tweets: {
      background: '#ffffff',
      color: '#000000',
      links: '#555555'
    }
  },
  features: {
    scrollbar: true,
    loop: false,
    live: true,
    hashtags: true,
    timestamp: true,
    avatars: false,
    behavior: 'all'
  }
}).render().setUser('azukinohiroki').start();
</script>

つまり、

  • hashtags:
  • timestamp:
  • avatars:

が無いとダメみたい。

iOS5のnextResponderの挙動

ちょっとハマったので解決してないけどとりあえずメモ。

iOS5がリリースされて、早速今のプロジェクトも5向けでリリースすることに。
スワイプの時はUIScrollViewでスクロール、タップの時は親ビューで処理したいって時に

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {	
  if (!self.dragging) {
    [self.nextResponder touchesEnded:touches withEvent:event]; 
  }
}

って感じでnextResponderにイベント投げてる人は多いと思う。
いや、実際は分からないけど僕はこうやってたわけです。

それがiOSを5にしたら親ビューにtouchesEndedが来ない…

仕方がないので力技で

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {	
  if (!self.dragging) {
    if (rootViewController_)
      [rootViewController_ touchesEnded:touches withEvent:event];
    else
      [self.nextResponder touchesEnded:touches withEvent:event]; 
    }
}

こんな実装にしてしまった…
自分が憎い。。
解決策をご存知の方がいたらぜひ教えて頂きたいです。

ってか公式ドキュメント読めって話ですかね…頑張ろう。


…スクロールビュー周りではいつもハマる。

nextResponder使わない方法ですが、スクロールビューの挙動を
理解するのにこの記事にはお世話になりました。

UIScrollView の上で UIView を動かしたい|Mac, IPHONE, IPAD
 
 

起動時にデバイスの向きを取得する

画面の向きによって挙動を変える時、willRotateToInterfaceOrientationを実装してやることで画面の向きの変更に対応する事ができます。

ただ、このメソッドは画面の向きが変わった時にだけ呼ばれるのでホームボタンが下の状態で起動すると呼ばれません。

そこで起動時に画面の方向を取ろうと

UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];

を呼んでみると、UIDeviceOrientationUnknownが返ってきてしまいました。
縦でも横でもUIDeviceOrientationUnknown。

困ったのでぐーぐる先生に聞いてみたところ、
http://stackoverflow.com/questions/1941482/uideviceorientationunknown-in-landscape-mode
こんなの出てきました。

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

これを使えば良かったんですね。
無事に画面の向きを取れました。

stackoverflowは便利ですね。

iOS3.2でのDisplayLinkの取り方

初めて書きますよ。

はてな記法とかまだよく分かってないです。
これから勉強するので許して下さい。

iPhoneでアニメーションループを使いたい時、iOS4.0以降のサンプルだと

CADisplayLink *aDisplayLink = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(drawFrame)];

ってなってますが、このメソッドはiOS4.0でしか動かないので古いiOSを使ってる端末だと落ちます。
憎い。。

CADisplayLink *aDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawFrame)];

こうすればiOS3.1以上の端末でもディスプレイリンクがとれます。
めでたしめでたし。