Re: NSView vs CALayer

Christiaan Hofman <[email protected]>
Newsgroups gmane.comp.macosx.devel
Message-ID <[email protected]>
On Sep 29, 2009, at 19:25, parfeon wrote:

>
>
>
> Christiaan Hofman-2 wrote:
>>
>>
>> On Sep 29, 2009, at 18:46, parfeon wrote:
>>
>>>
>>>
>>>
>>> Christiaan Hofman-2 wrote:
>>>>
>>>>
>>>> On Sep 29, 2009, at 18:03, parfeon wrote:
>>>>
>>>>>
>>>>>
>>>>> Christiaan Hofman-2 wrote:
>>>>>>
>>>>>>
>>>>>> On Sep 29, 2009, at 12:32, parfeon wrote:
>>>>>>
>>>>>>>
>>>>>>> Hello everyone.
>>>>>>>
>>>>>>> Working on project which draws some parts of its UI with
>>>>>>> CoreAnimation
>>>>>>> CALayers. Currently i need create some cover view, which will
>>>>>>> appear
>>>>>>> over
>>>>>>> whole UI (that NSView always there, coz it will response on user
>>>>>>> drag n
>>>>>>> drop).
>>>>>>> I'm stumbled with such problem as shown on screen
>>>>>>>
>>>>>>> http://www.nabble.com/file/p25659257/nsviewvscalayer.png
>>>>>>>
>>>>>>> http://img44.imageshack.us/i/nsviewvscalayer.png/
>>>>>>>
>>>>>>> Transparent view overlays the view in which I used CALayers for
>>>>>>> drawing.
>>>>>>> Dunno why, but when I change that subview (with CALayers) to any
>>>>>>> other (w/o
>>>>>>> CoreAnimation drawing... some standard IB elements) everything
>>>>>>> looks
>>>>>>> great.
>>>>>>>
>>>>>>>
>>>>>>> Can someone help me with this?
>>>>>>>
>>>>>>> Thanks
>>>>>>
>>>>>> I really can't understand your message and in particular what  
>>>>>> your
>>>>>> specific problem is. But the basic fact is that layer-hosting  
>>>>>> views
>>>>>> cannot have subviews, so I guess that's where you run into.
>>>>>>
>>>>>> Christiaan
>>>>>>
>>>>>> _______________________________________________
>>>>>> MacOSX-dev mailing list
>>>>>> [email protected]
>>>>>> http://www.omnigroup.com/mailman/listinfo/macosx-dev
>>>>>>
>>>>>>
>>>>> Quoted from:
>>>>> http://www.nabble.com/NSView-vs-CALayer-tp25659257p25663495.html
>>>>>
>>>>>
>>>>> My bad. Will try to explain all what I have done. Currently I want
>>>>> try to
>>>>> make behavior of window like in Transmission when You drag
>>>>> over .torrent
>>>>> file (appears blacj cover with info on center)
>>>>>
>>>>> 1. I have XIB with such structure as shown on image:
>>>>> http://img21.imageshack.us/img21/2967/mainxibstructure.png . I've
>>>>> placed
>>>>> there split view (2 views inside). Left view used for displaying
>>>>> source list
>>>>> (as we can see here
>>>>> http://www.nabble.com/file/p25659257/nsviewvscalayer.png) and the
>>>>> right view
>>>>> i used for displaying information (Place Holder). And also there
>>>>> over that
>>>>> split view "Drag&Drop Layer" (custom NSView where with CA I'm
>>>>> drawing
>>>>> transparent background);
>>>>> 2. After application do launch, my code placing inside "Place
>>>>> Holder" (with
>>>>> addSubview:) new custom view (instance of NSView placed in other  
>>>>> XIB
>>>>> file);
>>>>> 3. On awakeFromNib that custom view creates CALayers and draws  
>>>>> there
>>>>> content
>>>>> (background and buttons). On 'self' of custom view I'm setting
>>>>> setLayer to
>>>>> "baseLayer" (which holds all graphics) and then call
>>>>> setWantsLayer:YES;
>>>>> 4. And at the end we can see picture as I shown:
>>>>> http://www.nabble.com/file/p25659257/nsviewvscalayer.png It look's
>>>>> like
>>>>> "Drag&Drop Layer" cut out piece of custom view inside "Place
>>>>> Holder".
>>>>>
>>>>> Here is the code which I use to insert custom view inside "Place
>>>>> Holder":
>>>>>
>>>>> - (void)changeViewTo:(id)view{
>>>>> 	if(currentView != [view view])
>>>>> 		currentView = nil;
>>>>> 	
>>>>> 	if([[placeHolderView subviews] count] == 0){
>>>>> 		[placeHolderView addSubview:[view view]];
>>>>> 	else
>>>>> 		[placeHolderView replaceSubview:[[placeHolderView subviews]
>>>>> objectAtIndex:0] with:[view view]];
>>>>> 	
>>>>> 	currentView = [view view];
>>>>> 	
>>>>> 	[currentView setFrame:[[currentView superview] frame]];
>>>>> 	
>>>>> 	[currentView setFrameOrigin:NSMakePoint(0,0)];
>>>>> 	[currentView setAutoresizingMask:NSViewWidthSizable |
>>>>> NSViewHeightSizable];
>>>>> }
>>>>>
>>>>> currentView - is type of NSView
>>>>> placeHolderView - is IBOutlet on "Place Holder" view of NSView  
>>>>> class
>>>>>
>>>>> But when I'm adding inside placeHolder other custom view (which is
>>>>> inside
>>>>> loaded XIB) we can see this picture
>>>>> http://img182.imageshack.us/img182/1951/nsviewvsnsview.png In that
>>>>> view
>>>>> placed standard elements, which not drawn in real time.
>>>>>
>>>>> Sp till now I can't understand what I'm doing wrong. Can someone
>>>>> help with
>>>>> this?
>>>>
>>>> You still did not say what your problem is. What do you get? What  
>>>> do
>>>> you expect? What do you want to get? What do you think is wrong?
>>>> There's a lot of things going on, and I don't know which part is
>>>> relevant. And your Engrish also does not help.
>>>>
>>>> Perhaps you should try to reduce your problem to a much simpler
>>>> model.
>>>>
>>>> Is the transparent overlay that partially covers the window the
>>>> CADragnDropView? In that case your setup makes no sense, because  
>>>> the
>>>> splitview and dragndropview  are overlapping sibling views, which  
>>>> is
>>>> not supported and generally results in a mess.
>>>>
>>>> Christiaan
>>>>
>>>> _______________________________________________
>>>> MacOSX-dev mailing list
>>>> [email protected]
>>>> http://www.omnigroup.com/mailman/listinfo/macosx-dev
>>>>
>>>>
>>>
>>>
>>> Yes, problem lies in that, what I can't make DragNDrop to be
>>> transparent for
>>> view with content (I show that on screenshot). Ok, I got it, but why
>>> DragNDrop view is transparent when showing different views (with
>>> content
>>> which not drown with CA). I'm just little bit confused about this,
>>> at one
>>> hand it's work with other views, at another it doesn't want work
>>> correct
>>> with another custom view. Thats why i thought what there something
>>> wrong in
>>> methods which I use to draw or place this view.
>>
>> You should not be confused: it's wrong, the result is undefined, so  
>> it
>> just does not work. It is irrelevant in which way it goes wrong.
>>
>> Christiaan
>
> I see. Thats not good. I need somehow to reproduce such effect like  
> in drag
> .torrent file over Transmission (appears transparent background  
> which cover
> whole interface). Is there any well known practice for creating such
> overlay? I was trying to find something like that, but no w/o no luck.
>

The standard practice is to overlay a transparent borderless child  
window.

> Ah, there is another reason of creating this cover layer. As I can  
> found in
> documentations, registration for   dragNdrop files from outside of
> application to inside available only for NSView.
>
> Application delegate class can handle dragNdrop on dock icon, as for
> application window itself... I found useful methods inside NSView  
> class.
>


Views and windows can implement the NSDraggingDestination protocol.

Christiaan
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.