How to set content size of UIScrollView dynamically

前端 未结 11 1886
耶瑟儿~
耶瑟儿~ 2020-12-01 05:41

I got question about UIScrollview.

The story is I have a UIView named ChartsView which I re-draw it myself by override method drawRec

相关标签:
11条回答
  • 2020-12-01 06:01

    try this

    - (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 讨论(0)
  • 2020-12-01 06:06

    Thanks to IOS Rocks and CularBytes for the leads on this. I found two problems (for me) with the above solutions:

    1. I always have a container UIView as the only child of my UIScrollView, so I had to update the way I look up the last view in that child UIView (see below)
    2. I am offset'ing my content in the UIScrollView and as such needed to calculate the absolute position of that last UIView (so, relative to the window not the parent view)

    Also I am using autolayout to pin the sides of the UIScrollView, so I don't need to worry about width (as is CularBytes).

    Here's what I came up with and works (in Swift 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
    }
    

    I call this in my viewDidAppear() method.

    0 讨论(0)
  • 2020-12-01 06:06

    Calculate UIScrollview contentSize dynamically(depending subviews frame)

    Swift:

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    
        DispatchQueue.main.async {
            var contentRect = CGRect.zero
    
            for view in self.scrollView.subviews {
               contentRect = contentRect.union(view.frame)
            }
    
            self.scrollView.contentSize = contentRect.size
        }
    }
    

    Objective C:

     - (void)viewDidLayoutSubviews {
         [super viewDidLayoutSubviews];
    
         dispatch_async(dispatch_get_main_queue(), ^ {
                            CGRect contentRect = CGRectZero;
    
                            for(UIView *view in scrollView.subviews)
                               contentRect = CGRectUnion(contentRect,view.frame);
    
                               scrollView.contentSize = contentRect.size;
                           });
    }
    
    0 讨论(0)
  • 2020-12-01 06:08

    use contentInset with

    storyboard

    and

    programmatically

    follow

    0 讨论(0)
  • 2020-12-01 06:10

    While using scrollviews in storyboard it’s better to calculate content size according to number of views present in scrollview rather than giving content size programmatically with static value. Here are the steps to get content size dynamically.

    Step 1 : Add Scrollview to view in storyboard and add leading, trailing, top and bottom constraints (All values are zero).

    Step 2 : Don’t add directly views which you need on directly scrollview, First add one view to scrollview (that will be our content view for all UI elements). Add below constraints to this view. Leading, trailing, top and bottom constraints (All values are zero). Add equal height, equal width to Main view (i.e. which contains scrollview). For equal height set priority to low. (This is the important step for setting content size). Height of this content view will be according to the number of views added to the view. let say if you added last view is one label and his Y position is 420 and height is 20 then your content view will be 440.

    Step 3 : Add constraints to all of views which you added within content view as per your requirement.

    Ref:https://medium.com/@javedmultani16/uiscrollview-dynamic-content-size-through-storyboard-in-ios-fb873e9278e

    0 讨论(0)
提交回复
热议问题