• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: NSTextView resizeability and scrolling
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: NSTextView resizeability and scrolling


  • Subject: Re: NSTextView resizeability and scrolling
  • From: Stamenkovic Florijan <email@hidden>
  • Date: Mon, 14 Sep 2009 10:48:46 -0400


On Sep 11, 2009, at 13:36, Ross Carter wrote:

It looks like you instantiate the NSTextView in the nib. I would start by setting up the NSTextView manually and adding it as a subview to your FSEmbeddedTextView2 instance. Make sure that the textView has its resizing behavior set up correctly (vertical, horizontal, both, depending on your needs). Next, I would make sure that you are getting the frame changed notification and that it is firing embeddedTextViewFrameDidChange:.

Hi Ross,

This all worked and was double checked before I made my original post...

I have investigated this further, and came up with an implementation that works flawlessly, as far as I have tested it. It produces the desired resizing when editing text, as well as when resizing the ancestor scroll view (typically as a consequence of window resizing). It is based on the manipulation of the textViews self-resizing flags at appropriate times. Here is the implementation, in case anyone is interested:

Oh, there is no documentation so let me point something out. This implementation works under the assumption that the FSEmbeddedText (the name sucks, I have yet to figure out an appropriate name for this class) is contained in an NSScrollView, directly. For it to work, the textView outlet needs to be connected to an NSTextView that is a descendant view of the FSEmbeddedTextView. I believe it does not have to be a direct subview, but I have not tested this assumption yet...



@interface FSEmbeddedTextView : NSView {

	IBOutlet NSTextView* textView;
	NSRect textViewFrame;
	BOOL isAutosizing;
	NSScrollView* scrollViewAncestor;
}

@end


@implementation FSEmbeddedTextView

-(void)awakeFromNib
{
// find the scroll view ancestor and keep a reference
for(NSView* superview = [self superview] ; superview != nil ; superview = [superview superview])
if([superview isKindOfClass:[NSScrollView class]]){
scrollViewAncestor = (NSScrollView*)superview;
break;
}

if(textView != nil){

// track the frame of the text view
textViewFrame = [textView frame];
isAutosizing = NO;

// observe notifications of the text view resizing
[textView setPostsFrameChangedNotifications:YES];
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(embeddedTextViewFrameDidChange:)
name:NSViewFrameDidChangeNotification
object:textView];
}
}


-(void)resizeSubviewsWithOldSize:(NSSize)oldBoundsSize
{
// first turn off autoresizing on the text view
// this will make the NSTextView resize itself in the standard NSView fashion
[textView setHorizontallyResizable:NO];
[textView setVerticallyResizable:NO];

// then do the resize
isAutosizing = YES;
[super resizeSubviewsWithOldSize:oldBoundsSize];
isAutosizing = NO;

// now turn the resizing back on
[textView setHorizontallyResizable:NO];
[textView setVerticallyResizable:YES];

// and make the text view resize to fit
[textView sizeToFit];
}


-(void)embeddedTextViewFrameDidChange:(NSNotification*)n
{
// only react to this if this view is not currently autosizing
if(!isAutosizing){

// find out the diff between the old text view size
// and the new size
NSRect newTextFrame = [textView frame];
float increaseX = newTextFrame.size.width - textViewFrame.size.width;
float increaseY = newTextFrame.size.height - textViewFrame.size.height;

// revert the text view size to the size it has before this resize
[textView setFrame:textViewFrame];

// resize self to accomodate for the size of the text view
NSRect newSelfFrame = [self frame];
newSelfFrame.size.width += increaseX;
newSelfFrame.size.height += increaseY;

// the minimum size to resize self to is the contentSize of the scroll view
NSSize scrollViewContentSize = [scrollViewAncestor contentSize];
if(newSelfFrame.size.width < scrollViewContentSize.width)
newSelfFrame.size.width = scrollViewContentSize.width;
if(newSelfFrame.size.height < scrollViewContentSize.height)
newSelfFrame.size.height = scrollViewContentSize.height;

[self setFrameSize:newSelfFrame.size];
[self setNeedsDisplay:YES];
}

// update the text view frame we are keeping track of
textViewFrame = [textView frame];
}


-(void)dealloc
{
if(textView != nil){
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self name:NSViewFrameDidChangeNotification object:textView];
}

[super dealloc];
}


@end
_______________________________________________

Cocoa-dev mailing list (email@hidden)

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:
This email sent to email@hidden


References: 
 >NSTextView resizeability and scrolling (From: Stamenkovic Florijan <email@hidden>)
 >Re: NSTextView resizeability and scrolling (From: Ross Carter <email@hidden>)
 >Re: NSTextView resizeability and scrolling (From: Stamenkovic Florijan <email@hidden>)
 >Re: NSTextView resizeability and scrolling (From: Ross Carter <email@hidden>)

  • Prev by Date: Re: NSTask is "Thread Unsafe". What does that mean?
  • Next by Date: Re: How to observe every child entity
  • Previous by thread: Re: NSTextView resizeability and scrolling
  • Next by thread: Sheets positioning.
  • Index(es):
    • Date
    • Thread