Re: UICollectionView Moving
Re: UICollectionView Moving
- Subject: Re: UICollectionView Moving
- From: Luther Baker <email@hidden>
- Date: Wed, 09 Mar 2016 07:58:59 -0600
Ok - I think this is the final question.
I've created a layout that is essentially a bunch of ragged bottom columns
- like a Trello or Kanban board. The items in the collection view are
"stories" with size around 100x100. To begin with, I prepopulate the
underlying datastore and things are great, I've got 2, 3 or 4 stories in
each column. Dragging around works just as expected.
In my case, a column is a SECTION. A 4 column board then has 4 sections.
Problem: if I move ALL the items out of a column (a column is a SECTION)
... I can't move anything back INTO the column (section). I don't think the
SECTION has any HEIGHT if it has no items ... and consequently, dragging a
"story" item over the area that represents a column does nothing because
the CollectionView doesn't actually create anything there if I have at 0
item layoutAttributes for that section.
Is there a specific way to do this? I still have a supplementary view as
the column header and it always appears ... and in a UITableView, I think,
if I have a empty section but have a section header, the built in move
functionality will allow me to drag an item over the section header and
allow me to drop into the section (but I can't remember if this is true)
--- but dragging an "story" item over the supplementary view does nothing.
In the worst case, do I need to keep some sort of hidden item as the first
element? I take all "stories" out of a column (section), should I put at
least one, invisible item in the column (section) to keep it available as a
drag target?
Hope that makes sense - I tend to be wordy.
Thanks,
-Luther
On Tue, Mar 8, 2016 at 12:05 AM, Luther Baker <email@hidden> wrote:
> Now we're cooking with GAS!!!!!!!
>
> override func applyLayoutAttributes(layoutAttributes:
> UICollectionViewLayoutAttributes) {
> print("apply layout attributes!: \(titleLabel.text)")
> }
>
> Thanks Man!
> -Luther
>
>
>
> On Mon, Mar 7, 2016 at 11:54 PM, Luke Hiesterman <email@hidden>
> wrote:
>
>> By teaching a cell to respond to an attribute I merely meant that it
>> should override setLayoutAttributes: and do something in there with the
>> relevant property. Hope that helps.
>>
>> Luke
>>
>> On Mar 7, 2016, at 9:39 PM, Luther Baker <email@hidden> wrote:
>>
>> > teach your cell classes to respond to that property
>>
>> Want to think about this out loud. Wondering what would 'trigger' a
>> lookup on the layout's layoutAttributesForItemAtIndexPath ... and where
>> would I store the indexPath I am dragging around.
>>
>> If I were to be more literal - in my view controller, I handle the
>> UIGestureRecognizerState.Began event. At this point, I can get the
>> indexPath of the element I am about to move and if I change something on
>> that cell at that time, it sticks for the life of the drag without
>> reference to layoutAttributes. I also handle the
>> UIGestureRecognizerState.Changed event and again, if I retrieve the cell at
>> the gesture's locationInView and change things in it ... those changes
>> stick until I let go of the drag.
>>
>> Stepping into the custom layout for a minute ... as you suggested, I am
>> now implementing layoutAttributesForInteractivelyMovingItemAtIndexPath ...
>> and that is getting invoked in response to the
>> updateInteractiveMovementTargetPosition call I am making as the gesture
>> location changes. Now, I know the collection view's methods are triggering
>> the layout's callbacks - but I'm not sure what would trigger me to fetch
>> the custom attributes you are suggesting. At a minimum, to ask the layout
>> for the attributes at that indexPath, I'd have to actually be tracking the
>> 'selectedIndexPath' in which case, I could just get the cell and modify it
>> directly.
>>
>> I guess I'm wondering how to "teach my cells classes to respond to that
>> property" ... Cells are reused so I'm not even sure how I'd go about
>> setting up and tearing down a KVO type relationship for the specific cell I
>> am dragging around. Maybe there is a WWDC video that digs into this? or
>> it's an easy explain?
>>
>> Sorry for being so long-winded. I'm not sure I'm communicating my
>> question well. Hope you can understand my underlying question and nudge me
>> the right way but at any rate, thanks for your help so far. I'd love to use
>> an elegant, "made for CollectionView" solution ... but I don't think I'm
>> looking at it correctly yet. Just in general I guess, how can a change to
>> the layoutAttributes cause my CollectionViewDelegate and DataSources to
>> fetch the cell I'm dragging around and change it (or does it not require
>> the delegates or datasources ... ?)
>>
>> Thanks,
>> -Luther
>>
>>
>>
>> On Mon, Mar 7, 2016 at 2:45 PM, Luke Hiesterman <email@hidden>
>> wrote:
>>
>>> You can create your own subclass of UICollectionViewLayoutAttributes and
>>> add something like an “isMoving” property to that. Then teach your cell
>>> classes to respond to that property by changing the background color.
>>>
>>> Luke
>>>
>>> On Mar 7, 2016, at 11:44 AM, Luther Baker <email@hidden> wrote:
>>>
>>> Thanks Luke! That was it - I can drag and drop successfully now.
>>>
>>> One more question, how do I modify a property of the item I'm dragging
>>> around if the property is NOT currently in UICollectionViewLayoutAttributes
>>> ... I don't see a call to the datasource or delegate when I select the cell
>>> for moving ... so I'm not sure how to change the background color to "red"
>>> for instance.
>>>
>>> Would I have to add my own view to the superview and manually move it
>>> around in the dragging callbacks?
>>>
>>> Thanks!
>>> -Luther
>>>
>>>
>>> On Mon, Mar 7, 2016 at 11:59 AM, Luke Hiesterman <email@hidden>
>>> wrote:
>>>
>>>> I’d check your return value for this method in your layout:
>>>>
>>>> - (UICollectionViewLayoutAttributes
>>>> *)layoutAttributesForInteractivelyMovingItemAtIndexPath:(NSIndexPath
>>>> *)indexPath withTargetPosition:(CGPoint)position NS_AVAILABLE_IOS(9_0);
>>>>
>>>> Luke
>>>>
>>>> On Mar 7, 2016, at 9:55 AM, Luther Baker <email@hidden> wrote:
>>>>
>>>> I followed the directions here,
>>>>
>>>> http://nshint.io/blog/2015/07/16/uicollectionviews-now-have-easy-reordering/
>>>> - to add iOS9 style dragging to my UICollectionView - and it sort of
>>>> works.
>>>>
>>>> As described in the article, I added a long press gesture recognizer and
>>>> wired it in to make calls on the collection view -- but now, if I long
>>>> press, the element under my finger disappears. As I drag the transparent
>>>> image around, the other elements shift - but I can never see the
>>>> element I
>>>> am dragging around. When I let go, there is simply a hole left where I
>>>> "dropped" the element.
>>>>
>>>> I do, very much, have a custom layout and I'm not sure that if, for
>>>> drag, I
>>>> need to do anything special. Do I need to calculate the frame of the
>>>> item I
>>>> am dragging around? I'm not sure what to try next except to roll my own
>>>> dragging. Any thoughts or things to try?
>>>>
>>>> Thanks in advance.
>>>> _______________________________________________
>>>>
>>>> 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
>>>>
>>>>
>>>>
>>>
>>>
>>
>
_______________________________________________
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