Re: Linearly Scaling Text
Re: Linearly Scaling Text
- Subject: Re: Linearly Scaling Text
- From: Kyle Sluder <email@hidden>
- Date: Sun, 29 May 2011 18:31:37 -0700
On Sun, May 29, 2011 at 5:54 PM, Ajay Sabhaney <email@hidden> wrote:
> I have a suspicion that the reason for this has something to do with the fact that the NSTextView instance is being added as a subview of a layer-hosting view.
Yes, this is very much unsupported. You will need to stop using
NSTextView in this way.
In our forthcoming Mac applications, including the available beta of
OmniPlan 2 [1], we use thousands of layers to draw our outline view.
This view obviously contains editable text. Following an Apple
engineer's previous advice, we put an NSTextView in a sibling view of
our layer-hosting view. We get to do all our fancy animations and
effects with layers, but when editing text the user is interacting
with a field editor. So the view hierarchy looks like this:
NSScrollView (layer-backed)
+-- NSClipView (layer-backed)
+-- Empty NSView (layer-backed)
| +-- Field editor (layer-backed; added/removed on demand)
+-- Outline View (layer-hosting)
The problem with this setup is that layer-backed NSScrollViews on Snow
Leopard are still fundamentally broken if their document views return
YES from -isFlipped. rdar://problem/8009542 It is not currently
possible to fix this brokenness without calling private API.
Also, NSTextView draws its spell-check lines incorrectly if it's
layer-backed. rdar://problem/8644121 This problem was solved by Craig
Hockenberry in Twitteriffic 4 for Mac by manually drawing the spelling
underlines. I don't think we've made the same fix yet for our apps.
As for actually drawing the text in your layers when the user isn't
editing the text, we have a "layered text cell" class that renders its
text into a graphics context in -displayLayer. This layout manager is
shared with the field editor; when the user starts editing a cell, the
cell swaps out the field editor's text stack with its own, including
the text storage and layout manager. This is an *incredibly* delicate
process, because ownership of text system objects differs based on
whether the objects were loaded from nib or created using the
designated initializer, and you need to be very careful to set the
selection to a valid range before disassociating the text view from
its text storage.
Sharing the layout manager between the cell and the field editor is a
(significant) performance savings, but if you only have a few cells,
you could probably get away with not sharing the text stack, and just
updating the field editor's text storage contents with the contents of
the cell being edited.
Hope all that helps. Download the beta of OmniPlan 2 and play around
with the outline view to get a feel for how it winds up working out in
practice:
[1] http://www.omnigroup.com/products/omniplan/download/#beta_link
--Kyle Sluder
_______________________________________________
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