React Native的ScrollView頂部出現白條

剛換工作拴竹,接手新公司的一個RN項目悟衩,同事向我反映了一個問題,說我們的App的首頁栓拜,滾動后頂部就出現了一個白條座泳,僅在iOS端出現,Android上運行良好幕与。我一聽就猜想是ScrollView兼容出問題了挑势,嘗試用iOS 9和iOS 11手機分別運行了一下,在iOS 11的手機上重現了這個問題啦鸣。于是檢查代碼潮饱,發(fā)現是iOS 11上UIScrollView增加了contentInsetAdjustmentBehavior屬性。

/* Configure the behavior of adjustedContentInset.
 Default is UIScrollViewContentInsetAdjustmentAutomatic.
 */
@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior API_AVAILABLE(ios(11.0),tvos(11.0));


typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
    UIScrollViewContentInsetAdjustmentAutomatic, // Similar to .scrollableAxes, but for backward compatibility will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewInsets = YES inside a navigation controller, regardless of whether the scroll view is scrollable
    UIScrollViewContentInsetAdjustmentScrollableAxes, // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
    UIScrollViewContentInsetAdjustmentNever, // contentInset is not adjusted
    UIScrollViewContentInsetAdjustmentAlways, // contentInset is always adjusted by the scroll view's safeAreaInsets
} API_AVAILABLE(ios(11.0),tvos(11.0));

contentInsetAdjustmentBehavior默認為automatic時诫给,它會根據屏幕上是否有UINavigationBar香拉,UITabBar,可見狀態(tài)欄等自動調整ContentInset(并覆蓋任何手動設置的ContentInset)

剛好我們的主頁上有UITabBar中狂,于是就被自動調整了ContentInset凫碌,就出現了頂部的白條。

怎么解決

在新版本的React Native中已經修復了此問題胃榕,在ScrollView上新增了contentInsetAdjustmentBehavior屬性盛险,且默認為never,所以使用新版本React Native的童鞋一般是不會遇到這個問題的。但是我司App的React Native版本是0.38苦掘,因為歷史原因也不能直接去升級React Native版本换帜,所以就自己動手修改源碼吧。
以下是修改位置和源碼:(參考了React Native新版本的代碼)

文件RCTScrollView.m
initWithEventDispatcher方法中增加:

#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */
      // `contentInsetAdjustmentBehavior` is only available since iOS 11.
      // We set the default behavior to "never" so that iOS
      // doesn't do weird things to UIScrollView insets automatically
      // and keeps it as an opt-in behavior.
      if ([_scrollView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
        _scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
      }
#endif

以下代碼可在@implementation RCTScrollView任意位置加入鹤啡,我是加在sendScrollEventWithName方法前的惯驼。

#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */
- (void)setContentInsetAdjustmentBehavior:(UIScrollViewContentInsetAdjustmentBehavior)behavior
{
      // `contentInsetAdjustmentBehavior` is available since iOS 11.
      if ([_scrollView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
            CGPoint contentOffset = _scrollView.contentOffset;
            _scrollView.contentInsetAdjustmentBehavior = behavior;
            _scrollView.contentOffset = contentOffset;
      }
}
#endif

文件RCTScrollViewManager.m
可在@implementation RCTScrollViewManager中任意位置加入以下代碼,不過為了和其他代碼統一揉忘,我們在RCT_EXPORT_VIEW_PROPERTY那堆代碼后進行增加跳座。

#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */
RCT_EXPORT_VIEW_PROPERTY(contentInsetAdjustmentBehavior, UIScrollViewContentInsetAdjustmentBehavior)
#endif

@implementation RCTConvert (UIScrollView)中增加

#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */
RCT_ENUM_CONVERTER(UIScrollViewContentInsetAdjustmentBehavior, (@{
                                                                   @"automatic": @(UIScrollViewContentInsetAdjustmentAutomatic),
                                                                   @"scrollableAxes": @(UIScrollViewContentInsetAdjustmentScrollableAxes),
                                                                   @"never": @(UIScrollViewContentInsetAdjustmentNever),
                                                                   @"always": @(UIScrollViewContentInsetAdjustmentAlways),
                                                                }), UIScrollViewContentInsetAdjustmentNever, integerValue)
#endif

文件ScrollView.js
在ScrollView的propTypes中增加contentInsetAdjustmentBehavior屬性。

contentInsetAdjustmentBehavior: PropTypes.oneOf([
       'automatic',
       'scrollableAxes',
       'never', // default
       'always',
    ]),

修改完畢泣矛,運行后白條消失疲眷,不過這只是臨時解決方案,接下來還是要想辦法把React Native的版本升級一下您朽,以免遇到更多的坑狂丝。

參考GitHub: 1954438 #diff-973dcd0e3fbfcc5e35485bb6404a2fd2

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哗总,隨后出現的幾起案子几颜,更是在濱河造成了極大的恐慌,老刑警劉巖讯屈,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛋哭,死亡現場離奇詭異,居然都是意外死亡涮母,警方通過查閱死者的電腦和手機谆趾,發(fā)現死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叛本,“玉大人沪蓬,你說我怎么就攤上這事±春颍” “怎么了跷叉?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長营搅。 經常有香客問我云挟,道長,這世上最難降的妖魔是什么转质? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任植锉,我火速辦了婚禮,結果婚禮上峭拘,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好鸡挠,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布辉饱。 她就那樣靜靜地躺著,像睡著了一般拣展。 火紅的嫁衣襯著肌膚如雪彭沼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天备埃,我揣著相機與錄音姓惑,去河邊找鬼。 笑死按脚,一個胖子當著我的面吹牛于毙,可吹牛的內容都是我干的。 我是一名探鬼主播辅搬,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼唯沮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了堪遂?” 一聲冷哼從身側響起介蛉,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溶褪,沒想到半個月后币旧,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡猿妈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年吹菱,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片于游。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡毁葱,死狀恐怖,靈堂內的尸體忽然破棺而出贰剥,到底是詐尸還是另有隱情倾剿,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布蚌成,位于F島的核電站前痘,受9級特大地震影響,放射性物質發(fā)生泄漏担忧。R本人自食惡果不足惜芹缔,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓶盛。 院中可真熱鬧最欠,春花似錦示罗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拌阴,卻和暖如春绍绘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迟赃。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工陪拘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纤壁。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓左刽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摄乒。 傳聞我的和親對象是個殘疾皇子悠反,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內容