Re: UICollectionView Moving
Re: UICollectionView Moving
- Subject: Re: UICollectionView Moving
- From: Luke Hiesterman <email@hidden>
- Date: Wed, 09 Mar 2016 16:36:39 +0000
- Thread-topic: UICollectionView Moving
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<mailto: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<mailto: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<mailto: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<mailto: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<mailto: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<mailto: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<mailto: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<mailto: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<mailto: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<http://lists.apple.com/>
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden<mailto: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