Friday, March 15, 2013

UIScrollViewでnavigationBarやtoolBarをスクロール範囲に被らないように透けさせて配置

タイトルが長い

どういうことかと言うと、普通にnavigationBarとtoolBarをUIBarStyleBlackTranslucentに設定して、
UIScrollViewをself.viewに突っ込むだけだと、
スクロール範囲がnavigationBarとtoolBarに被ってしまって見栄えが非常に良くない
(例えば一番下までスクロールしても、UIScrollViewのcontentがtoolBarに被ってしまう)

これが例えば、UITableViewContollerを使ったりすると、
tableViewは透けるのにスクロール範囲はnavigationBar, toolBarに被らないように
よろしくやってくれたりする

それをUIScrollViewでやりたい
上記を実現する為に、
  1. UIScrollViewのcontentの余白をbarのheight分縮める
  2. UIScrollViewのスクロールバーの余白?もbarのheight分縮める
コードで書くと、以下のような感じ

// 対象のscrollView
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
                 :
- (void)viewDidLoad
{
 [super viewDidLoad];

 // barを透明に
 self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
 self.navigationController.toolbar.barStyle = UIBarStyleBlackTranslucent;

 UIEdgeInsets insets;
 // contentを縮める
 insets= self.scrollView.contentInset;
 insets.top = self.navigationController.navigationBar.frame.size.height;
 insets.bottom = self.navigationController.toolbar.frame.size.height;
 self.scrollView.contentInset = insets;
 // スクロールバーの範囲を縮める
 insets = self.scrollView.scrollIndicatorInsets;
 insets.top = self.navigationController.navigationBar.frame.size.height;
 insets.bottom = self.navigationController.toolbar.frame.size.height;
 self.scrollView.scrollIndicatorInsets = insets;
 
 // そのままだと初期位置がnavigationBarに被るので下にずらす
 CGPoint point = self.scrollView.contentOffset;
 point.y = -1*self.scrollView.contentInset.top;
 self.scrollView.contentOffset = point;
}

これでいろいろ透けさせることができそう(意味深)


参考

No comments:

Post a Comment