2012-05-09 5 views
19

UIScrollviewについて質問があります。UIScrollViewのコンテンツサイズを動的に設定する方法

私はUIViewというChartsViewという名前で、オーバーライドメソッドdrawRect()で自分自身で再描画しています。図面の内容は動的に生成されました。だから私は実行時までそのサイズを知らない。問題は、どのように/そのスーパービューの(scrollView)コンテンツサイズを動的に設定することができますか?

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

// not this way. it's fixed size..... 
     ChartsView *chartsView = [[ChartsView alloc]initWithFrame:CGRectMake(0, 0, 320, 800)]; 

     self.scrollView.contentSize = chartsView.frame.size; 

     [self.scrollView addSubview:chartsView]; 

    } 

答えて

1

ofcourseの上、この

- (void)viewDidLoad 
     { 
      [super viewDidLoad]; 

    // not this way. it's fixed size..... 
      ChartsView *chartsView = [[ChartsView alloc]initWithFrame:CGRectMake(0, 0, 320, 800)]; 

      self.scrollView.contentSize = chartsView.frame.size; 
      [self.scrollView setNeedsDisplay]; 
      [self.scrollView addSubview:chartsView]; 

    } 
+0

運スウィフト3の上に書かれた拡張機能です。回避策を見つけようとしています。描画を完了すると、グラフビューでスクロールビューのコンテンツサイズを設定しようとしています。質問は、どのようなAPIを使ってチャートのサイズを取得できるのですか? ((UIScrollView *)[self superview])contentSize = CGSizeMake(320,480); –

54

もう一つの簡単な方法

- (void)viewDidLoad 
{ 
    float sizeOfContent = 0; 
    UIView *lLast = [scrollView.subviews lastObject]; 
    NSInteger wd = lLast.frame.origin.y; 
    NSInteger ht = lLast.frame.size.height; 

    sizeOfContent = wd+ht; 

    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width, sizeOfContent); 
} 
+0

すてきなトリック。どのUIScrollViewでも使用できます。それに対して+1。 –

+0

私はちょうど1つの事を追加したいと思います。あなたの一部はviwDidAppearにこのコードを載せたいかもしれません:あなたのUIViewはviewDidAppearの前に描画されるかもしれないが、viewDidLoadが呼び出された後に描画されるかもしれないからです。これにより、ビューの最新の高さにアクセスできるようになります。 – mvb

+10

lastObjectは、サブビュー配列にインデックスされた最後のオブジェクトを返します。画面上の最も下位のサブビューは返しません。実際、lastObjectはビューの位置とは何の関係もなく、使い方が間違っています。 – AmitP

5

迅速(2.0)

@IBOutlet weak var btnLatestButton: UIButton! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let height = btnLatestButton.frame.size.height 
    let pos = btnLatestButton.frame.origin.y 
    let sizeOfContent = height + pos + 10 
    scrollview.contentSize.height = sizeOfContent 

} 

を試してみてくださいあなただけの修正を持っている場合でありますスクロールビューの表示回数 IOS Rocksの方法は利用可能ですが、私にとってはうまくいかず、より多くのスペースを作りました。

let lastView : UIView! = scrollview.subviews.last 
    let height = lastView.frame.size.height 
    let pos = lastView.frame.origin.y 
    let sizeOfContent = height + pos + 10 
    scrollview.contentSize.height = sizeOfContent 
3

IOSのおかげでRocksとCularBytesがリードしてくれました。私は上記のソリューションと(私にとっては)二つの問題が見つかりました:

私はいつも私UIScrollViewのの唯一の子としてコンテナのUIViewを持っているので、私はその子のUIViewで最後のビューを調べる方法を更新しなければならなかった
    1. 私はUIScrollViewの中に私のコンテンツをoffset'ingし、私もその最後のUIView(そう、窓ない親ビューに対して)

    の絶対位置を計算するために必要なようなのです

  • (下記参照) Autolayoutを使用してUIScrollViewの側面を固定しているので、幅について心配する必要はありません(CularBytesのように)。

    は、ここで私が思い付いたし、(スウィフト3.0に)どのような作品です:

    func setScrollViewContentSize() { 
    
        var height: CGFloat 
        let lastView = self.myScrollView.subviews[0].subviews.last! 
        print(lastView.debugDescription) // should be what you expect 
    
        let lastViewYPos = lastView.convert(lastView.frame.origin, to: nil).y // this is absolute positioning, not relative 
        let lastViewHeight = lastView.frame.size.height 
    
        // sanity check on these 
        print(lastViewYPos) 
        print(lastViewHeight) 
    
        height = lastViewYPos + lastViewHeight 
    
        print("setting scroll height: \(height)") 
    
        myScrollView.contentSize.height = height 
    } 
    

    私は私のviewDidAppear()方法でこれを呼び出します。

  • 1

    はこれを試してみてください -

    - (void)viewDidLoad 
        { 
         [super viewDidLoad]; 
    
    // not this way. it's fixed size..... 
         ChartsView *chartsView = [[ChartsView alloc]initWithFrame:CGRectMake(0, 0, 320, 800)]; 
    
         //self.scrollView.contentSize = chartsView.frame.size; 
         [self.scrollView setContentSize:CGSizeMake(chartsView.frame.size.width, chartsView.frame.size.height)]; 
         [self.scrollView addSubview:chartsView]; 
    
        } 
    
    1

    それはscrollView.subviews配列の最後のオブジェクトは、あなたのスクロールビューの最高のyの原点オブジェクトを返すことを100%保証するものではありません。サブビュー配列はZ-インデックスで整理されます(つまり、サブビュー配列の最後のオブジェクトはスクロールビューのサブビューで最高にスタックされたオブジェクトになります)。代わりに基本的なソート関数を使用する方が正確ですサブビューを反復し、最も高いy-起点を持つオブジェクトを取得します。ここで

    はそれがそうすることができ、迅速な3における基本的な機能である:

    func calculateContentSize(scrollView: UIScrollView) -> CGSize { 
        var topPoint = CGFloat() 
        var height = CGFloat() 
    
        for subview in scrollView.subviews { 
         if subview.frame.origin.y > topPoint { 
          topPoint = subview.frame.origin.y 
          height = subview.frame.size.height 
         } 
        } 
        return CGSize(width: scrollView.frame.size.width, height: height + topPoint) 
    } 
    

    使用法(viewDidLayoutSubviewsまたはいつでもあなたのコンテンツサイズのアップデート):

    scrollView.contentSize = calculateContentSize(scrollView: scrollView) 
    

    UPDATEのSWIFT 4

    ここではより迅速に合意したバージョンです。

    extension UIScrollView { 
        func updateContentView() { 
         contentSize.height = subviews.sorted(by: { $0.frame.maxY < $1.frame.maxY }).last?.frame.maxY ?? contentSize.height 
        } 
    } 
    

    使用法:

    myScrollView.updateContentView() 
    
    0

    これはまだ

    extension UIScrollView { 
        func updateContentViewSize() { 
         var newHeight: CGFloat = 0 
         for view in subviews { 
          let ref = view.frame.origin.y + view.frame.height 
          if ref > newHeight { 
           newHeight = ref 
          } 
         } 
         let oldSize = contentSize 
         let newSize = CGSize(width: oldSize.width, height: newHeight + 100) 
         contentSize = newSize 
        } 
    } 
    
    関連する問題