Search code examples
iosswiftuiscrollviewuiimageview

Unable to properly configure UIScrollView (Offset on top)


I have been fighting with this all morning and can't seem to find a solution. I have created a UIImageView, filled it with red, then added it to a UIScrollView and set the contentSize to the size of the UIImageView. If I print the contentOffset i see (0, 0) and if I print the contentSize and the UIImageView.frame.size they are the same but the red "image" always appears smaller than what the scrollView thinks the contentSize is.

If I scroll all the way to the top I see a cyan stripe about 100 pixels high above the red image and the scroll bar will not make it all the way to the top of what I believe the top of my scroll view to be. Although the top of the scroll bar does line up with the top of my red window so it would seem as though the scroll view is confused as to where it actually lives. Or more likely, I'm confused

IMG

Here is my what seems like very simple code...

    imgHorizon = UIImage.init(named:"horizon")!
    imgBezel = UIImage.init(named:"bezel_transparent")!
    imgWings = UIImage.init(named:"wings_transparent")!

    imgViewHorizon = UIImageView.init()
    imgViewBezel = UIImageView.init()
    imgViewWings = UIImageView.init()

    svHorizon = UIScrollView.init()

    super.init(coder: aDecoder)

    imgViewHorizon = UIImageView(frame: CGRect(x: 0, y: 0, width: imgBezel.size.width, height: imgHorizon.size.height))
    imgViewHorizon.backgroundColor = UIColor.red

    imgViewBezel = UIImageView(frame: CGRect(x: 0, y: 0, width: imgBezel.size.width, height: imgBezel.size.height))
    imgViewBezel.contentMode = UIViewContentMode.center
    imgViewBezel.clipsToBounds = true
    imgViewBezel.image = imgBezel

    imgViewWings = UIImageView(frame: CGRect(x: 0, y: 0, width: imgBezel.size.width, height: imgBezel.size.height))
    imgViewWings.contentMode = UIViewContentMode.center
    imgViewWings.clipsToBounds = true
    imgViewWings.image = imgWings

    svHorizon = UIScrollView(frame: CGRect(x: 0, y: 0, width: imgBezel.size.width, height: imgBezel.size.width))
    svHorizon.contentSize = CGSize(width: imgBezel.size.width, height: imgHorizon.size.height)
    svHorizon.contentMode = UIViewContentMode.scaleToFill
    svHorizon.bounces = false
    svHorizon.backgroundColor = UIColor.cyan
    svHorizon.contentOffset = CGPoint(x: 0, y: 0)

    svHorizon.addSubview(imgViewHorizon)
    addSubview(svHorizon)
    addSubview(imgViewBezel)
    addSubview(imgViewWings)

Solution

  • From the discussion in the comments it turns out that the Adjust Scroll View Insets option was checked in the attributes inspector of the ViewController. Unchecking it resolved the problem. Have a look at the image below. You need to uncheck the highlighted option.

    Attributes of the View Controller