Why is UIScrollView leaving space on top and does not scroll to the bottom
Asked Answered
D

13

34

I am new to objective-C programming.

I am using UIScrollView with some labels, image and text view on it.

I have turned off Autolayout and already tried with "Adjust scroll View Insets" on (situation described in title) and off (doesn't scroll).

This is what I insert into viewDidLoad:

    [scroller setScrollEnabled:YES];
[scroller setContentSize:CGSizeMake(320, 687)];

But I must be missing something very simple.

Directed answered 11/7, 2014 at 6:46 Comment(3)
Try with large number in contentSize like CGSizeMake(320, 1687)Giraud
It works. Thx. But I still have some empty space on top.Directed
Uncheck Under Top Bars on your controllerOrnate
G
52

1... Why is UIScrollView leaving space on top

With Storyboard- Goto view controller > Attribute Inspector > Uncheck Adjust Scroll View Insets property

With Code- For extra space set viewController property automaticallyAdjustsScrollViewInsets to NO, by default it is YES.

self.automaticallyAdjustsScrollViewInsets = false; 
scroller.contentInset = UIEdgeInsetsZero;
scroller.scrollIndicatorInsets = UIEdgeInsetsZero;
scroller.contentOffset = CGPointMake(0.0, 0.0);

2... does not scroll to the bottom

To make it scroll try with large number in contentSize like CGSizeMake(320, 1687). If it works that means you are not setting the contentSize large enough to have all its content.

Giraud answered 11/7, 2014 at 7:22 Comment(0)
K
34

Just select your view controller and set shown option to false (uncheck)

ViewController Inspector

Kokura answered 3/6, 2015 at 20:26 Comment(0)
N
29

iOS 11 && 12

if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
} else {
    automaticallyAdjustsScrollViewInsets = false
}
Nolasco answered 23/11, 2017 at 4:31 Comment(1)
iOS 12: scrollView.contentInsetAdjustmentBehavior = .neverIntramural
F
28

iOS 11

In my case only changing this UIScrollView Content Insets property in IB from Automatic to Never helped.

Fayina answered 5/4, 2018 at 13:1 Comment(1)
Thanks, I was going crazy on this problem, this is the only thing I've missed!Conservatory
G
6

Swift 3.0

self.automaticallyAdjustsScrollViewInsets = false

scrollView.contentInset = UIEdgeInsets.zero

scrollView.scrollIndicatorInsets = UIEdgeInsets.zero;     
Germinate answered 5/11, 2016 at 15:34 Comment(0)
C
2

Actually, the margin has nothing to do with ScrollViewInsets or contentOffset. It's just a conflict between SuperView.Top and SafeArea.Top pinning, happens when you pin the UIScrollView to top, bottom, left and right.

This is the right way to cover the top margin.

1) Pin all the four sides.

Pinning

2) Select the top constraint > Change Second Item to Superview.Top

conflict

3) Then the last step is to change the Constant to 0 (Zero). enter image description here

You might want to check this too: https://github.com/29satnam/MoveTextFieldWhenKeyboardAppearsSwift

Cortege answered 10/2, 2018 at 11:34 Comment(0)
M
2

I did below, my problem solved

changing UIScrollView Content Insets property in from Automatic to Never and Adding below code in viewDidLoad()

scroller.contentInset = UIEdgeInsetsZero;
scroller.scrollIndicatorInsets = UIEdgeInsetsZero;
scroller.contentOffset = CGPointMake(0.0, 0.0);`

enter image description here

Myramyrah answered 10/4, 2020 at 14:15 Comment(0)
D
1

On iPhoneX this will also occur due to some non-sense safe area stuff that auto-layout tried to account for. Fix (for iPhoneX) with this:

if (@available(iOS 11.0, *)) {
    scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
Discussant answered 19/7, 2018 at 4:29 Comment(0)
T
0

In your view .m file, use this code to fix this problem

-(void)layoutSubviews{
    // To fix iOS8 bug of scrollView autolayout
    if([[[[[UIDevice currentDevice]systemVersion] componentsSeparatedByString:@"."]objectAtIndex:0] integerValue] == 8){
        [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    }
}
Triserial answered 25/2, 2015 at 1:5 Comment(0)
V
0

Swift 3.0

self.automaticallyAdjustsScrollViewInsets = false

scrollView.contentInset = UIEdgeInsets.zero

scrollView.scrollIndicatorInsets = UIEdgeInsets.zero;    

scrollView.contentOffset = CGPoint(x: 0.0, y: 0.0);
Vestavestal answered 14/7, 2017 at 8:48 Comment(0)
B
0

Swift 3 (Auto Layout)

  1. Change "Layout Margins" to explicit
  2. Set margins to your needs

enter image description here

Bullard answered 24/7, 2017 at 2:47 Comment(0)
G
0

This works for me,

_scrollView.scrollIndicatorInsets = UIEdgeInsetsZero;
_scrollView.contentOffset = CGPointMake(0.0, 0.0);
[_scrollView setContentSize:CGSizeMake(self.view.frame.size.width, self.view.frame.size.height)];
Ghostwrite answered 1/2, 2019 at 5:48 Comment(0)
T
0

After user interface orientation going to landscape, my UIScrollView shown its UIScrollIndicator being misplaced. To fix this, you need to add the following code.

As per iOS 13, yet supporting iOS 12 and earlier:

    // Fixes the scroll indicator misplacement when rotated in landscape
    if #available(iOS 13.0, *) {
        v.automaticallyAdjustsScrollIndicatorInsets = false
    } else {
        // Fallback on earlier versions
        v.contentInsetAdjustmentBehavior = .never
    }

    v.contentInset = .zero
    v.scrollIndicatorInsets = .zero
Teryl answered 18/11, 2019 at 9:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.