2012/08/22

UIWebViewのscrollを検知する方法

iOSのUIWebViewでscrollを検知する方法
(iOS5.1)

「UIWebViewを滑らかにスクロールする方法」で紹介した事とほぼ同じです。
UIWebViewのscrollViewプロパティで参照できるUIScrollViewのdelegateを設定します。

@interface ScrollDetector : NSObject <UIScrollViewDelegate>
@end

@implementation ScrollDetector
#pragma mark - UIScrollViewDelegate methods
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
   NSLog(@"start");
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
  NSLog(@"end");
}
@end

// あとはwebViewへdelegateを設定するだけ
self.webView.scrollView.delegate = [[ScrollDetector alloc] init];



2012/07/01

UINavigationBarに影をつける方法

UINavigationControllerのNavigationBarに影をつける方法


ナビゲーションバーに立体感を持たせる感じで、ほんのり影をつける方法を探してココを見つけました。

http://stackoverflow.com/questions/5940076/how-to-create-uinavigationbar-drop-shadow

ありがたい情報を参考にして、こんな感じで。

私の場合、UINavigationControllerのサブクラス(MyNavigationController:クラス名は適当..)を使っているためこんなコードで実現できました。

ヘッダファイルに "#import <QuartzCore/QuartzCore.h>"を追加した後、ソースファイルをこんな感じで修正

 // MyNavigationController.m
 - (void)viewDidLoad
  {
    [super viewDidLoad];
   // ...
  // drop shadow
  CALayer *layer = self.navigationBar.layer;
  layer.masksToBounds = NO;
  layer.shadowColor = [[UIColor blackColor] CGColor];
  layer.shadowOffset = CGSizeMake(1.0f, 1.0f);
  layer.shadowRadius = 3.0f;
  layer.shadowOpacity = 1.0f;
}

アニメーションしたりするときは、layer.shouldRasterize = YES; とかしておくといいらしいです(未検証).

あと、layerに設定している各種プロパティの値については、こちらのブログで細かく検証されていました。すばらしー。

頭と尻尾はくれてやる!- 画像に影を付けたいのでいろいろプロパティをいじってみた


iosのUIWebViewを滑らかにスクロールする方法
(iOS5でのみ動作確認済み)
 // CGRectは一番上にスクロールしたいから適当なサイズ.
 CGRect topRect = CGRectMake(0, 0, 10, 10);
 [self.webView.scrollView scrollRectToVisible:topRect animated:YES];

探してみるとjavascriptでスクロールする方法が見つかったけれど、
objc側から制御した方がぬるぬる動くスクロールで見栄えがよかった。

ポイントはwebview.scrollViewでUIScrollViewが参照できるという点。

2012/01/06

gem twitterで認証付きproxyを越える方法 (続き)

昨日の続き。

rubygemsのfaradayの動作をスッキリさせる方法。

require 'rubygems'
require 'twitter'
require 'pp'

module Faraday
  class Adapter
    class NetHttp 
      def net_http_class(env)
        if proxy = env[:request][:proxy] 
          Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:uri].user, proxy[:uri].password)
        else
          Net::HTTP
        end 
      end 
    end 
  end 
end

Twitter.configure do |config|
  config.proxy = { 
    :uri => "http://ユーザ名:パスワード@localhost:3128/"
  }
end

pp Twitter.user_timeline("wakatter")

これが一番すっきりする気がした。

gem twitterで認証付きproxyを越える方法

rubygemsのtwitterライブラリ"twitter"を使って認証付きproxyを越える方法を考えてみました。
ライブラリ自体の使い方は調べ中なので他のサイトを漁ってみてください。

方法1. Twitter.configureでproxy(別々にuri,user,password)を設定する。
require 'rubygems'
require 'twitter'

Twitter.configure do |config|
   config.proxy = {
       :uri => "http://hostname",
       :user => "proxy_user_name",
       :password => "proxy_password"
    }
end

p Twitter.user_timeline("wakatter")

方法2. Twitter.configureでproxy(uri文字列)を設定する。

設定値として"http://ユーザID:パスワード@ホスト名:ポート番号/"なURIとして有効な文字列を指定してあげたいという方法。

require 'rubygems'
require 'twitter'
require 'pp'

module Faraday
  class Connection
    def proxy(arg = nil)
      return @proxy if arg.nil?

      @proxy = 
        case arg 
        when String then {:uri => proxy_arg_to_uri(arg)}
        when URI    then {:uri => arg}
        when Hash
          if arg[:uri] = proxy_arg_to_uri(arg[:uri])
            arg 
          else
            raise ArgumentError, "no :uri option."
          end 
        end 
      if (@proxy[:uri].user and @proxy[:uri].password) then
        @proxy[:user] = @proxy[:uri].user
        @proxy[:password] = @proxy[:uri].password
      end 
      @proxy
    end 
  end 
end

Twitter.configure do |config|
  config.proxy = { 
    :uri => "http://ユーザ名:パスワード@localhost:3128/"
  }
end

pp Twitter.user_timeline("wakatter")

ここまでやってみて、fadarayというgemライブラリのプロキシ設定のデータ構造がopen-uriで使える環境変数での値と異なるところが気持ち悪い事がはっきりした。



2011/08/03

メモリ管理の基本ルール in objective-C

AppleのMemory Management Programming Guideを読んで大事なところをメモ。


メモリ管理の基本ルール

メモリ管理とは、オブジェクトの所有権の管理
  • 自分で作ったオブジェクトは自分のもの。
    • "alloc", "new", "newObject", "copy", "mutableCopy"とかで始まる名前のメソッドで作る。
  • "retain"を使ってオブジェクトの所有権を得る。
    • 受け取ったオブジェクトは受け取ったそのメソッド内では有効なことが保証され、そのメソッドも安全にオブジェクトを返してくれるはず。
    • "retain"を使う二つのケース
      1. accessor methodの実装、または'init'メソッドの実行
      2. 必要なオブジェクトが他の操作で無効化されないために。
  • 必要なくなったら、オブジェクトの所有権を捨てる。
    • "release"または"autorelease"で所有権を捨てられる。
    • Cocoaではオブジェクトの所有権を捨てることをオブジェクトを"release"するという。
  • 自分のものでないオブジェクトの所有権は捨ててはいけない。


Cocoaのルールに沿ってコードを書かないと後で困る事になる、というお話。

2010/11/30

掃除しました。

残骸をお掃除しました。

まぁ、ぼちぼちと...。