jigneshbrahmkhatri
jigneshbrahmkhatri

Reputation: 3637

UITextView to be resized with contentsize after pinch gesture of another view

I am facing an issue of resizing UITextView in pinch gesture recognizer method. This gesture recognizer is for another view. I want that textview should also be resized along with that view.

I successfully able to resize UITextView according to requirement. But I have issue with text displayed in textview. After zooming in and zooming out for few times. contents inside UITextView does not come properly (see below image "After zooming in/out"). It decreases content width. I checked content size of UITextView, but it gives same width before resizing and after resizing.

Here, I have set text alignment to center for UITextView. I have also applied contentInset to UIEdgeInsetZero.

Any help will be appreciated.

Before zooming in/out Before zooming in/out

After zooming in/out After zooming in/out

Upvotes: 12

Views: 1298

Answers (3)

SarpErdag
SarpErdag

Reputation: 781

Trey's answer works but it causes too much CPU usage. Try implementing the same method using KVO.

[self addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionOld context:NULL];

and then,

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if([keyPath isEqualToString:@"bounds"]) {

        [self removeObserver:self forKeyPath:@"bounds"];

        CGRect bounds = self.bounds;
        self.bounds = CGRectZero;
        self.bounds = bounds;

        [self addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionOld context:NULL];
    }
}

Upvotes: 0

Trey
Trey

Reputation: 356

I won't profess to be an expert on this, but it seems that UITextView wants to have a baseline of CGRectZero to work with, I have run into this very issue and my findings were that the problem presented itself when shrinking the UITextView, not when enlarging, so by overriding - (void)layoutSubviews like this:

- (void)layoutSubviews {
    CGRect bounds = self.bounds;
    self.bounds = CGRectZero;
    self.bounds = bounds;
}

in a subclass of UITextView this issue will be resolved. This definitely isn't the most elegant thing I've ever seen, but it's the only solution I've come up with.

Upvotes: 1

Sam
Sam

Reputation: 2579

Are you calling setNeedsLayout on the parent view after you have altered the frame?

Try logging the bounds of the text view like so:

NSLog(@"Bounds: %@", NSStringFromCGRect(textView.bounds));

Upvotes: 2

Related Questions