I have a horizontal scrollable collectionView with two cells that take up the screen. Inside those cells is an embedded collection view that scrolls vertically. Is there a way for me to scroll the vertical CV inside the first cell, while using its ContentOffset to scroll the vertical CV in the second cell?
Here's how I'm trying to accomplish it:
let scrollView = notification.userInfo!["scrollView"] as! UICollectionView
if scrollView.contentOffset.y <= 250.0 {
childViewControllerForPosts.collectionViewForGroups?.collectionView.setContentOffset(CGPointMake(0, scrollView.contentOffset.y), animated: false)
self.topVerticalConstraint?.constant = -scrollView.contentOffset.y
}
else {
if self.topVerticalConstraint?.constant > -250 {
// Make sure it stays at -250
self.topVerticalConstraint?.constant = -250
}
}
The FeedCell would be the main collection view (which horizontally scrolls) that contains the vertical scrolling collection view. I'm trying to access the second one to change the vertical contentOffset when I scroll the one in first one.
Here's how I'm trying to save the variable that should contain the second main collection view:
collectionViewForGroups = collectionView(collectionView!, cellForItemAtIndexPath: NSIndexPath(forItem: 1, inSection: 0)) as? FeedCell
EDIT:
Note that when I scroll horizontally, the vertical scroll view didn't change. But I want it to change with the one I just scrolled in the gif. If I were to scroll the 2nd vertical collection view, the UIView above will reappear because the topLayConstraint changes due to the vertical contentOffset change.
Related
I have a tableview which grows and shrink on user click. When user lands to the screen the height of tableview is same as cell(single cell). On click of that cell multiple cells get populated and tableview height would be same as no. Of cells. I want have animation from last cell to first cell, but what I am getting is animation from first cell to last cell, my tableview is at bottom of the screen(which grows in upper direction)
This is my code inside will display method
cell.alpha = 0
UIView.animate(with
duration:0.4,
delay:0.05*Double
(
indexPath.row),animation: {
cell.alpha = 1
}
According to my understanding, you want a tableView to scroll from bottom to top.
// scroll from bottom to top with delay
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
tableView.setContentOffset(.zero, animated: true)
}
I want to implement the following sort of view where the view can be completely scrolled and houses 2 different scrollview (Main and the secondary) with infinite scrollable content. This represents the exact thing I want.
The red view is superview - should scroll vertically
The green view is of the height of the current view and is just static. That doesnt scroll
The blue view is the horizontal scrollview where for each label there is a yellow vertically scrolling infinity collection view
the labels scroll as in the given video. under each label there is the collection view I mentioned in point 3
The blue box is the scroll view and I want the scrolling to happen horizontally in a parallax way such as this.
I am able to implement the above parallax in the correct fashion but each title contains their own collectionview. When I implement this I am not able to have an infinite scroll. Below is the code for that :
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView == containerScrollView {
for i in 0..<shotsData.count {
let label = scrollView.viewWithTag(i + tagValueL) as! UILabel
let view = scrollView.viewWithTag(i + tagValueV) as! ShotsMediaView
let scrollContentOffset = scrollView.contentOffset.x + scrollView.frame.width
let viewOffset = (view.center.x - scrollView.bounds.width/4) - scrollContentOffset
label.center.x = scrollContentOffset - ((scrollView.bounds.width/4 - viewOffset)/2)
}
}
}
How can I exactly achieve the same behavior with an infinite scroll vertically? I want each of these titles to have collectionview that have the dynamic height each.
I did a crude implementation of this.
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView == colorsCollectionView {
let newContentOffSetX = scrollView.contentOffset.x
let distance = contentOffSetX + newContentOffSetX
// Scroll the text collection view proportinately
let titleScrollDistance = (distance/colorsCollectionView.frame.width * 75.0)
titlesCollectionView.contentOffset = CGPoint(x: titleScrollDistance, y: titlesCollectionView.contentOffset.y)
contentOffSetX = newContentOffSetX
}
}
contentOffSetX is a property of the class(ViewController) that I use to keep track of the scrolling distance of the bottom collection view. Initially that is set to 0. When the user scrolls the collection view at the bottom, the above delegate method is called. Then I use the contentOffSet to get the distance that was scrolled along the X-axis. I map that to the width of the title labels(hardcoded as 75.0) to calculate the distance that collection has to be scrolled. Hope this can be refined to serve your purpose, but I am sure that there are better methods out there :)
I have two collection views as seen on the image on the link. I want such that when I scroll the vertical collection view up, the other views together with the horizontal collection view on top of it should scroll together. How can I do this?
The above image shows two collection views, the one on top is a horizontal collection view while the one on the bottom is a vertical collection view
You can do something like in the code snippet I just provided...
Implement the scroll view delegate method... and based on the collection view scrolled, set the content offset of the other one as per your calculations...
let horizontalCollectionView = UICollectionView()
let verticalCollectionView = UICollectionView()
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView == horizontalCollectionView {
// set the content off set of the vertical collection view
} else if scrollView == verticalCollectionView {
// Set the content off set of horizontal collection view
}
}
One of the cells in a UITableView contains a scroll view. I want to be able to scroll the content in the cell horizontally, but NOT vertically.
How can I achieve this?
Additionally, the scroll view is a subview of UIWebView, so I cannot control its content size.
I have tried setting the content offset directly, but this prevents the entire table from being scrolled. I want the table to scroll vertically, but not the content in the cell.
func scrollViewDidScroll(_ scrollView: UIScrollView) {
DispatchQueue.main.async {
scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: 0)
}
}
You will have to ensure the content is smaller than the vertical bounds of the UIScrollView to prevent vertical scrolling, and in addition you'll need to set scrollView.alwaysBounceVertical = false.
I have a UITableViewController with embedded collectionView ... Each items of which is either UICollectionView / UITableView.. I need the Parent Tableview to scroll up/down first and only it has completed the child should be scrolled up or down.
I have mostly achieved this but the tableview is not scrolling fully to the bottom (10% remaining) with an unwanted parallax effect while scrolling. I understand this is due to the reason that i am passing the offset from child to parent but i need make the child still so that it only moves with parent and not on its own. But i do not know how to do it.
In the childViewController i did this :
override func scrollViewDidScroll(scrollView: UIScrollView) {
if(parent.tableView.contentOffset.y >= (parent.tableView.contentSize.height - parent.tableView.frame.size.height)) {
//
if self.collectionView?.contentOffset.y <= 0 || self.collectionView?.contentOffset.y >= self.collectionView?.contentSize.height{
print("Child scrolled the top")
parent.tableView?.setContentOffset(scrollView.contentOffset, animated: true)
}
}else {
print("Parent TableView should move")
parent.tableView?.setContentOffset(scrollView.contentOffset, animated: false)
}
This is my Layout
1.Without Scroll 2.While Scrolling Parellax 3.Scrolled(distance remaining in bottom)
The height of HomeTableView = view.frame.height and the same for each item in UICollectionView.
Can anyone help me to get full bottom scroll & remove parallax effect.