On Wed, Nov 18, 2009 at 12:22 AM, Ross Carter <rosscarter...@me.com> wrote:
> You mean when wrapping is turned off? You get that behavior for free. Try 
> this:
>
> 1. Create a new project in XCode.
> 2. In the app delegate header, set up an IBOutlet to a NSTextView.
> 3. In interface Builder, add a NSTextView to the window and connect it to the 
> IBOutlet.
> 4. Add this to the app delegate .m :
>
> - (void)awakeFromNib {
>        [myTextView setHorizontallyResizable:YES];
>        NSSize tcSize = [[myTextView textContainer] containerSize];
>        tcSize.width = FLT_MAX;
>        [[myTextView textContainer] setContainerSize:tcSize];
>        [[myTextView textContainer] setWidthTracksTextView:NO];
> }
>
> Run the app. As you add text to the text view, you will see that the 
> horizontal scroller adjusts as needed to accommodate the longest line. You 
> don't have to do anything more.

Hi Ross,

This _almost_ works for me except the horizontal scroll bar doesn't
change as I add more text if I've added around 100 characters to the
line. If I write more words at the end of the line of text, the
horizontal scroll-bar's thumb doesn't update to indicate that there is
more "width" to scroll and I cannot scroll to the end of the line.

However, you have given me a great tip and I believe that I have
solved the problem. As a delegate of the NSTextView, I receive
textDidChangeNotifications and I update the width of the NSTextView to
accommodate the widest length of text via my selector
"updateScriptViewWidth" (below).  This works exactly as I wanted to
and there is no flickering.  Let me know if you see any problem with
the below.

Thanks again Ross!
Lyndsey Ferguson


- (CGFloat)longestLineOfText
{
        CGFloat longestLineOfText = 0.0;
        
        NSLayoutManager* layoutManager = [scriptTextView layoutManager];
        
        NSRange lineRange;
        NSUInteger glyphIndex = 0;
        NSUInteger glyphCount = [layoutManager numberOfGlyphs];
        while (glyphIndex < glyphCount) {
                
                NSRect lineRect = [layoutManager
lineFragmentUsedRectForGlyphAtIndex:glyphIndex
                                                                                
                                          effectiveRange:&lineRange
                                                                                
                         withoutAdditionalLayout:YES];
                
                longestLineOfText = max(longestLineOfText, lineRect.size.width);
                
                glyphIndex = NSMaxRange(lineRange);
        }
        
        return longestLineOfText;
        
}

// ----------------------------------------------------------------------------

- (void)updateScriptViewWidth
{
        static CGFloat previousLongestLineOfText = 0.0;

        CGFloat currentLongestLineOfText = [self longestLineOfText];
        if (currentLongestLineOfText != previousLongestLineOfText) {
                previousLongestLineOfText = currentLongestLineOfText;
                                
                NSTextContainer* container = [scriptTextView textContainer];
                CGFloat padding = [container lineFragmentPadding];
                
                NSRect frame = [scriptTextView frame];
                frame.size.width = currentLongestLineOfText + padding * 2;
                [scriptTextView setFrame:frame];
        }
}


-- 
Lyndsey Ferguson
_______________________________________________

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