backgroundColor colorWithPatternImage ends up stretched if the view size changes, instead of repeating?

StackOverflow https://stackoverflow.com/questions/1418735

  •  07-07-2019
  •  | 
  •  

Question

I'm setting a view background to a repeating image using colorWithPatternImage. If the view size changes after I've set the background the first time, the image gets stretched instead of repeating for the new size - any ideas how I can fix this?

This is what I'm doing:

  • set the view's background in viewDidLoad:

    frameView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"frame-repeat.png"]];

  • grab some information from the server, update the view, change the view's frame size to fit the new content (usually, this means making the view taller)

  • background image is now stretched, even if I set the backgroundColor again using the exact same code.

If I don't do the initial background set, and only set it after I retrieve the data from the server and change the view size, it looks great - repeats, and no stretching. However, that means no background while the data is loading... looks ugly.

Has anyone else run into this?

Thanks for any help!

Was it helpful?

Solution

The answer is quite simple, just call

[[self view] setNeedsDisplay];

in the controller when you change the frame size (or whereever you do it, bottom line is to send a setNeedsDisplay message to the view after the frame change). If this doesn't work - try setting the background color.

And if this doesn't work, implement your own custom view, and in it override the method

- (void) drawRect:(CGRect) rect {
   CGRect myBounds = self.bounds;
   CGContextRef context = UIGraphicsGetCurrentContext();
   [[UIColor colorWithPatternImage:[UIImage imageNamed:@"frame-repeat.png.png"]]set];
   CGContextFillRect(context, myBounds);
}

And then, after the resizing, send the setNeedsDisplay to your view. This will work for 100%.

Hope this was helpful, Pawel

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top