On Jun 6, 2011, at 6:29 PM, Joe White wrote:

> Hi,
> 
> I currently have a custom subclassed NSTextView as a subview of an NSView
> (which is its delegate).
> 
> I'm trying to to dynamically resize the minimum width of the NSTextView
> based on the string input so that view resizes to fit (the height is always
> one line).
> 
> This is the NSTextView init:
> 
>   - (id)initWithFrame:(NSRect)frame {
> 
>  self = [super initWithFrame:frame];
> 
>  if (self != nil) {
> 
>    [self setFont:[NSFont fontWithName:@"Helvetica" size:self.frame.size.
> height - 10]];
> 
>    [self setSelectable:YES];
> 
>    [self setEditable:YES];
> 
>    [[self textContainer] setContainerSize:NSMakeSize(FLT_MAX, self.frame.
> size.height)];
> 
>    [self setHorizontallyResizable:YES];
> 
>    [self setVerticallyResizable:NO];
> 
>  }
> 
>  return self;
> 
> }
> 
> I tried the following on didChangeText to no avail (the text container's
> maximum width is set to FLT_MAX and isHorizontallyResizable is true):
> 
>   - (void)didChangeText {
> 
>  [self sizeToFit];
> 
>  [self setNeedsDisplay:YES];
> 
> }
> 
> After reading these articles:
> -
> http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/TextStorageLayer/Tasks/TrackingSize.html#//apple_ref/doc/uid/20000927-CJBBIAAF
> -
> http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html#//apple_ref/doc/uid/20001809-CJBGBIBB
> 
> It seems like I have to use the NSTextView's layout manager to force
> resizing of the text view. So I tried adding the following to didChangeText
> (although I'm sure if that is the right place).
> 
>        (void) [[self layoutManager] glyphRangeForTextContainer:[self
> textContainer]];
> 
>  NSLog(@"%f",[[self layoutManager] usedRectForTextContainer:[self
> textContainer]].size.width);
> 
> When I input text the log just prints out the initial width of the text
> view.
> 
> I'm not sure where I'm going wrong with this, any help or pointers would be
> much appreciated.

You don't need to override -didChangeText. In fact you don't need to subclass 
NSTextView.

If you create a new project in Xcode, and add the following code to your 
application delegate class, you will see a textView that expands horizontally 
as you type. I think that is what you want.

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
        NSTextView *tv = [[NSTextView alloc] initWithFrame:NSMakeRect(100, 100, 
100, 25)];
        [tv setHorizontallyResizable:YES];
        [tv setVerticallyResizable:NO];
        [tv setMaxSize:NSMakeSize(500, 25)];
        
        [[self.window contentView] addSubview:tv];
        [tv release];

        NSTextContainer *tc = [tv textContainer];
        NSSize tcSize = [tc containerSize];
        tcSize.width = 1.0e6;
        [tc setContainerSize:tcSize];
        [tc setWidthTracksTextView:NO];
}

I assume you have a plan in place to deal with situations where the textView at 
maximum width cannot display all the characters entered (or pasted) by the user.

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to