Search code examples
iosuiscrollviewword-wrap

UIScrollView - How to wrap subviews to new line when subview overflows scroll view bounds?


I am creating a scrollview that will have subviews of same heights and different widths. I wanted to know what the best way to wrap the subviews to new lines when the last subview exceeds the scroll views width bounds?

I tried detecting if the subview was outside of the scroll view bounds, then increasing the yOffset, but that doesn't seem to work:

if !CGRectContainsPoint(self.scrollView.frame, CGPointMake(subView.frame.origin.x+subView.frame.size.width, subView.frame.origin.y))
 {
      scrollViewOffsetY += subView.frame.height
      scrollViewOffsetX = 5
      subView.frame.origin = CGPointMake(scrollViewOffsetX, scrollViewOffsetY)
 }

Solution

  • Figured it out. Here is what I did:

        var scrollViewOriginX: CGFloat = 0.0
        var scrollViewOriginY: CGFloat = 0.0
    
        for var index = 0; index < 10; index++
        {
    
                var subview = UIView()
                //...customize your subview here.../
    
                // Check if subview is out of scroll view's bounds
                if !CGRectContainsPoint(self.scrollView.bounds, CGPointMake(scrollViewOriginX + scrollViewOffsetX + subview.frame.size.width, 0))
                {
                    // Increase Y Offset
                    scrollViewOriginY += subview.frame.height + scrollViewOffsetY
                    // Reset X Offset
                    scrollViewOriginX = scrollViewOffsetX
    
                    subview.frame.origin = CGPointMake(scrollViewOriginX, scrollViewOriginY + scrollViewOffsetY)
                }
                else
                {
                    subview.frame.origin = CGPointMake(scrollViewOriginX + scrollViewOffsetX, scrollViewOriginY + scrollViewOffsetY)
                }
    
                self.scrollView.addSubview(subview)
                scrollViewOriginX += subview.frame.width + scrollViewOffsetX
    
                self.scrollView.contentSize = CGSizeMake(self.scrollView.bounds.width, scrollViewOriginY+subview.frame.height+scrollViewInsetBottom)
        }