Re: UICollectionView Moving
Re: UICollectionView Moving
- Subject: Re: UICollectionView Moving
- From: Luther Baker <email@hidden>
- Date: Thu, 10 Mar 2016 02:56:22 -0600
That was it. Thanks Luke!
Really digging this control ...
On Wed, Mar 9, 2016 at 10:36 AM, Luke Hiesterman <email@hidden> wrote:
> UICollectionView doesn’t know that your layout is conceptually columns, so
> when a section is empty, it has no concept of what space is appropriate to
> drop items into an empty section. You need to help it out by overriding the
> following method on your layout:
>
> - (NSIndexPath *)targetIndexPathForInteractivelyMovingItem:(NSIndexPath
> *)previousIndexPath withPosition:(CGPoint)position NS_AVAILABLE_IOS(9_0);
>
> Luke
>
> On Mar 9, 2016, at 5:58 AM, Luther Baker <email@hidden> wrote:
>
> 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