37

について質問がありまし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];

    }
4

12 に答える 12

62

もう1つの簡単な方法

- (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);
}
于 2013-02-13T11:33:45.573 に答える
23

scrollView.subviews 配列の最後のオブジェクトが、スクロール ビューで最大の y 原点オブジェクトを返すことは 100% 保証されていません。subviews 配列は Z-Index によって配置されます (つまり、subviews 配列の最後のオブジェクトは、最も高くスタックされたオブジェクトになり、スクロール ビューのサブビューの一番上のサブビューになります。代わりに、基本的な並べ替え関数を使用する方が正確です。サブビューを反復処理して、y 原点が最も高いオブジェクトを取得します。

スイフト4

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

使用法 (viewDidLayoutSubviewsコンテンツ サイズの更新中またはそのたびに):

myScrollView.updateContentView()
于 2016-10-14T19:30:22.727 に答える
2

これを試して

- (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];

    }
于 2012-05-09T15:15:21.773 に答える
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];

    }
于 2016-06-28T04:03:45.980 に答える
1

contentInset を使用する

絵コンテ

プログラム的に

従うこれが一番うまくいく

于 2020-10-14T10:01:34.353 に答える