1

I am creating a small chat app in which I use a custom subclass of UIScrollView to present the messages. This app is just for practicing so I don't want to use a third party library. I am implementing this UIScrollView via autolayout, after reading the technical note 2154 by Apple and several tutorials explaining this, and my implementation is almost working but the content view of my UIScrollView doesn't seem to fill all the space available.

The code which presents the ScrollView is:

public class ChatView: UIScrollView {
    private var contentView: UIView

    ...

    // This get called by all the init methods. contentView is already created ( contentView = UIView() )
    private func setupViews() {
        self.translatesAutoresizingMaskIntoConstraints = false
        contentView.translatesAutoresizingMaskIntoConstraints = false

        self.addSubview(contentView)

        let constraint1 = NSLayoutConstraint(item: self, attribute: .Top, relatedBy: .Equal, toItem: contentView, attribute: .Top, multiplier: 1.0, constant: 0.0)
        let constraint2 = NSLayoutConstraint(item: self, attribute: .Bottom, relatedBy: .Equal, toItem: contentView, attribute: .Bottom, multiplier: 1.0, constant: 0.0)
        let constraint3 = NSLayoutConstraint(item: self, attribute: .Width, relatedBy: .Equal, toItem: contentView, attribute: .Width, multiplier: 1.0, constant: 0.0)
        let constraint4 = NSLayoutConstraint(item: self, attribute: .CenterX, relatedBy: .Equal, toItem: contentView, attribute: .CenterX, multiplier: 1.0, constant: 0.0)

        self.addConstraints([constraint1, constraint2, constraint3, constraint4])

        self.layoutIfNeeded()

        // Later, the messages are added to the contentView. I don't think is relevant to see the exact code (but I can post it if needed)
        // Each message is added using autolayout and the constraints only reference the messages themselves and contentView
    }
}

When I add a ChatView to my view controller (using storyboards), with its four sides pinned to views which are not in his hierarchy, the following problem happens:

Screenshot of the problem

In the image, the scrollView cannot be scrolled upwards any more. There seem to be a space which should be filled and isn't. If I scroll down, I have the exact same problem but the empty space is below the content. In the following images you can see that the contentView is smallest than the ChatView itself:

The debugger view of the problem wo constraints

And the same view hierarchy but with the constraints shown:

The debugger view of the problem with constraints

In both images the view in the background is the ChatView and the selected one is the contentView. I haven't been able to figure why the content view doesn't cover the full ChatView space.

Thanks in advance!

1 Answer 1

1

I finally stumbled upon the answer while searching a different problem, in another stackoverflow question. The key is to open the storyboard and set in the container view controller "AdjustsScrollViewInsets" to "NO".

In code it's simply (inside the view controller):

self.automaticallyAdjustsScrollViewInsets = NO;

Not the answer you're looking for? Browse other questions tagged or ask your own question.