ScrollView snapToInterval/snapToOffsets not working when the scrollView width is a float number in IOS.
Nobody has claimed this yet.
- Dominant language
- C++
- Stars
- 127k
- Forks
- 25.3k
- Avg merge
- 1d 23h
- Merged PRs (30d)
- 4
Description
Description
ScrollView snapToInterval/snapToOffsets not working when the scrollView width is a float number in IOS, because isHorizontal method in RCTEnhancedScrollView return a unexpected result when the width is a float.
- (BOOL)isHorizontal:(UIScrollView *)scrollView
{
return scrollView.contentSize.width > self.frame.size.width;
}
In my reproducer: https://snack.expo.dev/@hiyuki/scrollview-snaptointerval-bug, when i set scrollView's width with a integer, such as 100, snapToInterval/snapToOffsets works fine, but when i set the width with a float number, such as 100.3, snapToInterval/snapToOffsets does't work.
Steps to reproduce
- open the reproducer link: https://snack.expo.dev/@hiyuki/scrollview-snaptointerval-bug
- execute it with expo go in a IOS device
- scroll the scrollView content vertically, snapToInterval/snapToOffsets does't work when touch up
React Native Version
0.76.5
Affected Platforms
Runtime - iOS
Output of npx react-native info
System:
OS: macOS 14.3.1
CPU: (12) x64 Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
Memory: 1.77 GB / 16.00 GB
Shell:
version: "5.9"
path: /bin/zsh
Binaries:
Node:
version: 18.17.1
path: /usr/local/bin/node
Yarn: Not Found
npm:
version: 9.8.1
path: /usr/local/bin/npm
Watchman:
version: 2024.01.22.00
path: /usr/local/bin/watchman
Managers:
CocoaPods:
version: 1.15.2
path: /usr/local/bin/pod
SDKs:
iOS SDK:
Platforms:
- DriverKit 23.4
- iOS 17.4
- macOS 14.4
- tvOS 17.4
- visionOS 1.1
- watchOS 10.4
Android SDK:
API Levels:
- "34"
- "35"
Build Tools:
- 33.0.1
- 34.0.0
- 35.0.0
System Images:
- android-34 | Intel x86_64 Atom
- android-34 | Google APIs Intel x86_64 Atom
Android NDK: Not Found
IDEs:
Android Studio: 2024.1 AI-241.18034.62.2412.12266719
Xcode:
version: 15.3/15E204a
path: /usr/bin/xcodebuild
Languages:
Java:
version: 17.0.12
path: /usr/bin/javac
Ruby:
version: 2.6.10
path: /usr/bin/ruby
npmPackages:
"@react-native-community/cli":
installed: 15.0.0-alpha.2
wanted: 15.0.0-alpha.2
react:
installed: 18.3.1
wanted: 18.3.1
react-native:
installed: 0.76.5
wanted: ^0.76.5
react-native-macos: Not Found
npmGlobalPackages:
"*react-native*": Not Found
Android:
hermesEnabled: true
newArchEnabled: true
iOS:
hermesEnabled: true
newArchEnabled: true
Stacktrace or Logs
no crash
Reproducer
https://snack.expo.dev/@hiyuki/scrollview-snaptointerval-bug
Screenshots and Videos
set ScrollView's width with 100.3, snapToInterval/snapToOffsets does't work.
https://github.com/user-attachments/assets/23b5d09f-a45a-4a6b-8327-1feba66bc41f
set ScrollView's width with 100, snapToInterval/snapToOffsets works fine.
https://github.com/user-attachments/assets/e72e4934-46f2-4601-b5ec-01c800ee7f3a
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start at RCTEnhancedScrollView's isHorizontal: method and reproduce the issue using the linked Snack with integer and float ScrollView widths on iOS. Verify that snapToInterval and snapToOffsets snap correctly with fractional widths, and check the related iOS behavior against the reported React Native 0.76.5 setup.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- ios, objective-c, react-native
- Domain
- mobile
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100