mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-17 12:19:12 +08:00
Fix content offset validation
Summary:
Content offset was broken because on initial render contentSize is {0,0} so any positive offset is lost. Also inset top/bottom and left/right were inversed �, this led to bad initial scrolling offset when using contentInset. This fixes it by making sure contentSize is actually measured (not {0,0}. I guess it's possible that the content is ACTUALLY {0,0} but in that case I don't think it really matters).
**Test plan**
Tested that a scrollview has proper scroll position when specifying contentOffset. Also tested that it works well with contentInset.
```js
<ScrollView contentOffset={{y: 100}}>
<View style={{height: 1000}} />
</ScrollView>
```
Closes https://github.com/facebook/react-native/pull/15670
Differential Revision: D5771221
Pulled By: shergin
fbshipit-source-id: 455ed8fd5a4ad1ec61780b573d1a8ef1d77dd124
This commit is contained in:
committed by
Facebook Github Bot
parent
ed31f7a97d
commit
64be88398d
@@ -315,12 +315,17 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init)
|
||||
|
||||
UIEdgeInsets contentInset = self.contentInset;
|
||||
CGSize contentSize = self.contentSize;
|
||||
|
||||
CGSize boundsSize = self.bounds.size;
|
||||
|
||||
self.contentOffset = CGPointMake(
|
||||
MAX(-contentInset.top, MIN(contentSize.width - boundsSize.width + contentInset.bottom, originalOffset.x)),
|
||||
MAX(-contentInset.left, MIN(contentSize.height - boundsSize.height + contentInset.right, originalOffset.y)));
|
||||
|
||||
// If contentSize has not been measured yet we can't check bounds.
|
||||
if (CGSizeEqualToSize(contentSize, CGSizeZero)) {
|
||||
self.contentOffset = originalOffset;
|
||||
} else {
|
||||
// Make sure offset don't exceed bounds. This could happen on screen rotation.
|
||||
CGSize boundsSize = self.bounds.size;
|
||||
self.contentOffset = CGPointMake(
|
||||
MAX(-contentInset.left, MIN(contentSize.width - boundsSize.width + contentInset.right, originalOffset.x)),
|
||||
MAX(-contentInset.top, MIN(contentSize.height - boundsSize.height + contentInset.bottom, originalOffset.y)));
|
||||
}
|
||||
}
|
||||
|
||||
#if !TARGET_OS_TV
|
||||
|
||||
Reference in New Issue
Block a user