I'm trying to make kind of collage, so I want to resize image and drag it to any position of scroll view. Currently I can drag image only when it is bigger than scroll view. But when it is smaller than it sticks to top left corner. Yes, I can use scrollViewDidZoom to move image to center for example, but it is not what I'm looking for. For example I want to allow users to drag an image to any position of the scroll view, like this
To do that I just merge big empty image with my image I want to move. Looks like a bad solution, but it working as I wanted
I have an UIImageView which covers all of my screen. The pictures that I'm displaying are bigger than it and the .contentmode is set to the.scaleAspectFill So the UImageView is just showing a cropped version of each picture.
In front of them is a CollectionViewController which consists
of multiple pages.
I've used scrollViewWillEndDragging to change my background picture when I move through the pages with a short animation ( each page has a specific background).
Please Help on:
How can I make the background picture move with my touch move horizontally until the scrollViewWillEndDragging happens and move back to its original position if the scrollViewWillEndDragging didn't happen.
Thank you for your time.
Does anyone know how to do something like that?
I would like to get a continuous scrolling of the image.
Example: https://vimeo.com/262632459
Here is a simple way of doing it.
Set it up
Create the image you want to scroll in the background. You need to make it minimum as wide as the widest screen you want to support.
Place two instances of the image you created next to each other inside a regular UIView.
Place the view on the screen with the x position at 0.
Animate
Animate the view repeatedly forever, moving the x position from 0 to -width. The width is the width of your image (just the width of one instance). Note that since you want to pull the view left, you must pull x in the negative direction.
The image will now slide left until the second instance x is at 0. At this position the animation will start over, moving the view one whole image size to the left. This movement will not be noticeable since you use two identical images.
You need to use scrollview or subclass of scrollview and in that scrollview add your image you want to scroll.
override scrollViewDidScroll delegate method of scrollview, here you can control the animation (how much user can scroll or other behaviours)
https://developer.apple.com/documentation/uikit/uiscrollviewdelegate/1619392-scrollviewdidscroll?language=objc
And if you want circular image(when image reach to last start again) add two copy of same image, One at zero position, before your acutal image and one at last position after actual image and as soon as image reaches to last remove the font image and add in the last, and if user scrolling in right direction remove the last image and add in front.
In scrollview add three imageview and keep adding and removing from the front and last based on the scroll direction. In scrollViewDidScroll you will get direction of scoll based on change in x value
In the Facebook app, when you're on the feed, and you tap on a photo to view it, a few things happen:
The image animates/moves to the center of the screen, no matter where its current position in the table view (middle, partially off the screen towards the bottom, top, whatever)
As the image moves to the center of the screen, the rest of the table view is faded out (alpha = 0)
When you drag the image up or down, the alpha of the table view is restored proportionally (I think) to the offset of the image from the center of the screen
At this point you'll notice that in the Feed, the place where the image used to be, is now empty (giving you the impression that you 'brought' that image up front). You see this by dragging the image up/down and you can see the Feed/table view behind the image.
Following #2, if the image is already proportional (that is, the image's preview on the Feed/table view was a proportionally-scaled one without any cropping) then it just moves to the center. If the image was cropped at all (because it was too tall, etc to fit properly in the Feed) then the rest of the image is revealed at the same time that it is moved to the center of the screen.
Once the image moves to the center of the screen, the gallery view controller elements show up (Done button, Like/Comment buttons, etc)
Following #4, if you swipe to another image (swipe left/right in the full-screen image view to another image in the same album), and then attempt the drag up/down in #3, you'll see that the first image is back to where it was in the Feed.
Finally, if you drag the image up/down past a certain threshold, it is dismissed and the Feed is revealed again.
This is what I think is happening conceptually, and I'd like some confirmation if this is the right approach (these bullets below don't map to the bullets above):
When user taps on an image, add that imageView as a subview of the table view's container view, but add it at the exact same position so that the movement of the imageView from the cell into the main view is not seen.
Then animate the movement of that image to the center of the screen. At the same time, reduce the alpha of the table view so that it reaches 0 at the same time that the imageView reaches the center of the screen.
Once the image reaches the center of the screen, push a modal view controller without animating it, and add the imageView as a subview of the modal view controller's view (effect #6 above)
Any dragging of the image reduces the alpha of the modal view controller and increases the alpha of the Feed table view (effect #3 above) and dragging above a certain threshold triggers the animation that hides the gallery and shows the Feed again (effect #8 above)
Questions:
Am I on the right track? If so, how do I bring the imageView from the cell into the front view - and keep it at that very same position?
When you swipe to another image, the original image is 'restored' into its original location in the cell of the table view. Is this actually just moving one imageView from one view to the next? How the heck do you send it back to the original cell - keep a pointer to that cell when the user taps on the image, and then do something like customCell.imageViewContainerView addSubview:originalImageView? This then needs to be reversed if the user swipes back to the original image?
This whole thing to me seems like a non-trivial implementation, but I think the effect is awesome and I'm also damn curious as to how it's done. Am I overthinking it and there's actually a really easy way to do it, or am I right to give props to whoever wrote the FB app?
Am I on the right track? If so, how do I bring the imageView from the cell into the front view - and keep it at that very same position?
I think that you are right on the conceptual steps. It's not difficult to get the imageView from the cell and add it to the controllers view. You can use the methods like
- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view
to get the correct position for the imageview.
When you swipe to another image, the original image is 'restored' into its original location in the cell of the table view. Is this actually just moving one imageView from one view to the next? How the heck do you send it back to the original cell - keep a pointer to that cell when the user taps on the image, and then do something like customCell.imageViewContainerView addSubview:originalImageView? This then needs to be reversed if the user swipes back to the original image?
I think that this is made by some kind of protocol between the gallery and the table view controllers. Maybe it just hide/show the image, and the images in the gallery are actually a different object.
Anyway, if you want to use the same imageview, you can send the object with the protocol between the two controllers.
Hope this helps a little ;) I think that key is in the convertRect methods.
How can I pop up alert when an bouncing image touches a draggable image the same way it's done in this app: http://tinyurl.com/kspnh6
Example: there is an image that is going up and down the screen and it touches an image that we can drag around. How can we show an alert view when that image touches the moving image?
When you move the dragged view around, check the updated frame property against that of the other items.
You can use a function such as CGRectIntersectsRect to determine if the frame of any two views overlap each other (i.e. when it's time to show the alert).
This acheives a rectangular "hit test", there would be more work involved if you wanted the hit test to respect rounded shapes etc.