My problem is I need to change the label text color below my scroll view if the content of my scroll view is not all visible.
For example: I have a label colored red, if all the content of the scroll view can be seen on the screen(not using scroll at all), and the label colored blue if all the content inside of my scroll view is not visible. how to do it programmatically?
NOTE: I have a contentView -> scrollView (programmatically) -> stackView (programmatically).
(stackview inside scrollview and scrollview inside contentview. and a label below the content view)
Thanks.
1: Get the height of the content view of scrollView
let totalHeight = scrollView.contentSize.height
2: In viewDidLoad check:
if totalHeight > scrollView.frame.size.height {
// can scroll more
} else {
// full content visible
}
3: once user starts scrolling, you can call:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
//reached to bottom
} else {
// can scroll more
}
}
This solution worked for me, with the difference that I placed it in the viewDidAppear
if scrollView.contentSize.height > scrollView.visibleSize.height {
// can scroll more
} else {
// full content visible
}
Related
I have a scroll view and inside the scrollview I am having a content view with few subview inside this content view. My requirement is to zoom the content view but not the subview of content view.
Can anyone faced this before, or did the same. Any help would be appreciated.
Thanks in advance.
Scroll view just apply transform to contentView. This transform applied to all children in contentView. So you can apply inverted transform to children to negate parent transform.
func scrollViewDidZoom(_ scrollView: UIScrollView) {
guard let content = viewForZooming(in: scrollView) else {
return
}
let t = content.transform.inverted()
for v in content.subviews {
v.transform = t
}
}
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 :)
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.
2 Tableviews in a ViewController with different size of cell height. When i scroll on the view controller , need to scroll both tableview cell at same time also both table cells also need to hide at same time.
200px height of cell in top tableview, 50px height of bottom tableview.
when i swipe 100px , top table cell scrolls 100 px and bottom table cell should be scrolled 25px.
is this parallel scrolling any possible? any suggestion..
Thanks in advance
As UITableview is derived from UIScrollview you can get the scroll amounts in the delegate method
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
You can get content offset of the scrollview which is being scrolled and assign that to the other tableview.
In this method you should be able to access both tableviews.
The property you need to check is contentOffset.
firsttableview.contentOffset = scrollview.contentOffset
You can use this function of UIScrollView to scroll multiples UITables parallel
func scrollViewDidScroll(scrollView: UIScrollView) {
if scrollView == tableView1 {
self.tableView1.contentOffset = CGPointMake(0, scrollView.contentOffset.y)
self.tableView2.contentOffset = CGPointMake(0, scrollView.contentOffset.y)
}
else if scrollView == self.tableView2!
{
self.tableView1.contentOffset = CGPointMake(0, scrollView.contentOffset.y)
}
else if scrollView == self.bottomMenu_grid!
{
print(scrollView.contentOffset.x)
self.tableView2.contentOffset = CGPointMake(scrollView.contentOffset.x, scrollView.contentOffset.y)
}
}
I have a scroll view with several elements (textview, label, image view...), I need to display an uiview when my label appears on the screen when I'm scrolling.
How can I do ?
Make sure your view controller is the scroll view delegate. Implement the scrollViewDidScroll method, and check whether the scroll view's frame, offset by the contentOffset, overlaps the label's frame.
func scrollViewDidScroll(scrollView: UIScrollView) {
let offset = self.scrollView.contentOffset
let onScreen = CGRectOffset(self.scrollView.frame, offset.x, offset.y)
if CGRectIntersectsRect(onScreen, self.label.frame) {
NSLog("Overlap")
}
}
If you want to detect when the label is fully on the screen, use CGRectContainsRect instead of CGRectIntersectsRect.