UIScrollView的詳細(xì)使用介紹和實現(xiàn)原理分析[2018.06.20更新]

UIScrollView.png

概述

UIScrollView(滾動視圖)是一個在日常開發(fā)中使用頻率極高的容器視圖控件, 它允許用戶通過滾動和縮放的方式查看超出屏幕區(qū)域大小的內(nèi)容, 在應(yīng)用程序開發(fā)中經(jīng)常使用到的UITableView(列表視圖)、UICollectionView(集合視圖)和UITextView(文本視圖)都是它的子類.

下面將從用戶界面和事件處理兩個方面對UIScrollView做一次詳細(xì)的使用介紹和簡要的實現(xiàn)原理分析.

用戶界面相關(guān)

內(nèi)容區(qū)域相關(guān)API介紹

該屬性用于標(biāo)識內(nèi)容區(qū)域的起點相對于scrollView的起點的偏移量, 默認(rèn)值為CGPointZero

@property(nonatomic) CGPoint contentOffset;

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;

該屬性用于標(biāo)識內(nèi)容區(qū)域的尺寸, 默認(rèn)值為CGSizeZero

@property(nonatomic) CGSize contentSize;

該屬性用于標(biāo)識為內(nèi)容區(qū)域周圍增加的可滾動區(qū)域, 默認(rèn)值為UIEdgeInsetsZero

@property(nonatomic) UIEdgeInsets contentInset;

該屬性用于標(biāo)識為內(nèi)容區(qū)域周圍增加的總的可滾動區(qū)域, 該屬性值的最終結(jié)果取決于contentInsetAdjustmentBehavior屬性的值

@property(nonatomic, readonly) UIEdgeInsets adjustedContentInset API_AVAILABLE(ios(11.0));

- (void)adjustedContentInsetDidChange API_AVAILABLE(ios(11.0)) NS_REQUIRES_SUPER;

該屬性用于配置safeAreaInsets如何影響adjustedContentInset屬性的值, 該屬性可設(shè)置四個枚舉值:

  • UIScrollViewContentInsetAdjustmentAutomatic: 默認(rèn), 在UIScrollViewContentInsetAdjustmentScrollableAxes的基礎(chǔ)上添加了向前兼容. 不論是否可以滾動, 如果scrollView所在的控制器位于導(dǎo)航控制器中且automaticallyAdjustsScrollViewInsets = YES, 則在上下兩個方向上adjustedContentInset = contentInset + safeAreaInsets成立
  • UIScrollViewContentInsetAdjustmentScrollableAxes: 在可滾動方向上adjustedContentInset = contentInset + safeAreaInsets成立. 比如: contentSize.width/height > frame.size.width/height或者alwaysBounceHorizontal/Vertical = YES
  • UIScrollViewContentInsetAdjustmentNever: 在任何情況下adjustedContentInset = contentInset成立
  • UIScrollViewContentInsetAdjustmentAlways: 在任何情況下adjustedContentInset = contentInset + safeAreaInsets成立
@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior API_AVAILABLE(ios(11.0));

該屬性用于標(biāo)識內(nèi)容區(qū)域和scrollViewAuto Layout參考線

@property(nonatomic,readonly,strong) UILayoutGuide *contentLayoutGuide API_AVAILABLE(ios(11.0));

@property(nonatomic,readonly,strong) UILayoutGuide *frameLayoutGuide API_AVAILABLE(ios(11.0));
指示器相關(guān)API介紹

該屬性用于配置指示器樣式, 該屬性可設(shè)置三個枚舉值:

  • UIScrollViewIndicatorStyleDefault: 默認(rèn), 黑內(nèi)容白邊框, 適用于任何背景
  • UIScrollViewIndicatorStyleBlack: 全黑, 較小, 適用于白色背景
  • UIScrollViewIndicatorStyleWhite: 全白, 較小, 適用于黑色背景
@property(nonatomic) UIScrollViewIndicatorStyle indicatorStyle;

該屬性用于標(biāo)識為指示器周圍增加的可滾動區(qū)域, 默認(rèn)值為UIEdgeInsetsZero

@property(nonatomic) UIEdgeInsets scrollIndicatorInsets;

該屬性用于標(biāo)識是否在滾動時指示器可見, 默認(rèn)為值YES

@property(nonatomic) BOOL showsHorizontalScrollIndicator;
@property(nonatomic) BOOL showsVerticalScrollIndicator;

該方法用于閃動一下指示器. 建議在將scrollView展示給用戶時調(diào)用一下, 以提醒用戶該控件可以滾動

- (void)flashScrollIndicators;
滾動相關(guān)API介紹

該屬性用于標(biāo)識是否允許滾動, 默認(rèn)值為YES

@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;

該屬性用于標(biāo)識是否只允許同時滾動一個方向, 默認(rèn)值為NO. 如果設(shè)置為YES, 則用戶在水平/豎直方向上開始進(jìn)行滾動操作, 便禁止同時在豎直/水平方向上進(jìn)行滾動

注: 當(dāng)用戶在對角線方向上開始進(jìn)行滾動操作, 則本次滾動可以同時在兩個方向上進(jìn)行滾動

@property(nonatomic, getter=isDirectionalLockEnabled) BOOL directionalLockEnabled;

該屬性用于標(biāo)識是否允許通過點擊狀態(tài)欄讓距離狀態(tài)欄最近的scrollView滾動到頂部, 默認(rèn)值為YES

注: 當(dāng)同時存在多個將該屬性設(shè)置為YESscrollView, 則該屬性在iPhone中無效; 在iPad中將距離狀態(tài)欄最近的scrollView滾動到頂部

@property(nonatomic) BOOL scrollsToTop;

該屬性用于標(biāo)識是否按頁數(shù)進(jìn)行滾動, 默認(rèn)值為NO. 如果設(shè)置為YES, 則在滾動時只會停止在scrollViewbounds的整數(shù)倍處

@property(nonatomic, getter=isPagingEnabled) BOOL pagingEnabled;

該屬性用于標(biāo)識是否有觸底反彈效果, 默認(rèn)值為YES

@property(nonatomic) BOOL bounces;

該屬性用于標(biāo)識是否總是有觸底反彈效果(即使contentSize小于scrollView的尺寸), 默認(rèn)值為NO

注: 該屬性生效的前提條件為bounces = YES

@property(nonatomic) BOOL alwaysBounceHorizontal;
@property(nonatomic) BOOL alwaysBounceVertical;

該屬性用于配置當(dāng)用戶手指離開屏幕后滾動減速的速率, 該屬性可設(shè)置兩個常量:

  • UIScrollViewDecelerationRateNormal: 默認(rèn), 慢慢停止
  • UIScrollViewDecelerationRateFast: 快速停止
@property(nonatomic) CGFloat decelerationRate NS_AVAILABLE_IOS(3_0);

該方法用于將指定區(qū)域滾動到剛好可見處

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;
縮放相關(guān)API介紹

該屬性用于標(biāo)識最小縮放比例, 默認(rèn)值為1.0

@property(nonatomic) CGFloat minimumZoomScale;

該屬性用于標(biāo)識最大縮放比例, 默認(rèn)值為1.0

注: 該屬性值必須大于minimumZoomScale才能進(jìn)行縮放

@property(nonatomic) CGFloat maximumZoomScale;

該屬性用于標(biāo)識縮放比例, 默認(rèn)值為1.0

@property(nonatomic) CGFloat zoomScale NS_AVAILABLE_IOS(3_0);

- (void)setZoomScale:(CGFloat)scale animated:(BOOL)animated NS_AVAILABLE_IOS(3_0);

該方法用于將內(nèi)容縮放到指定區(qū)域

- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated NS_AVAILABLE_IOS(3_0);

該屬性用于標(biāo)識是否允許觸底反彈, 默認(rèn)值為YES

@property(nonatomic) BOOL bouncesZoom;

該屬性用于標(biāo)識是否正在縮放

@property(nonatomic,readonly,getter=isZooming) BOOL zooming;

該屬性用于標(biāo)識是否正在觸底反彈

@property(nonatomic,readonly,getter=isZoomBouncing) BOOL zoomBouncing;

用戶界面實現(xiàn)原理

framebounds

這部分內(nèi)容將會簡單介紹一下UIView的兩個屬性: framebounds, 這將有助于理解UIScrollView用戶界面的實現(xiàn)原理.

iOS系統(tǒng)中, 視圖的坐標(biāo)系統(tǒng)的原點默認(rèn)位于視圖的左上角, 右方向為x軸的正方向, 下方向為y軸的正方向. 其中, frame用于描述視圖在父視圖坐標(biāo)系統(tǒng)中的位置和尺寸; bounds用于描述視圖在自身坐標(biāo)系統(tǒng)中的位置和尺寸. 下面通過兩個代碼片段來具體說明:

// 代碼片段1
UIView *superView = [[UIView alloc] initWithFrame:CGRectMake(20.f, 20.f, 100.f, 100.f)];
superView.backgroundColor = [UIColor redColor];
[self.view addSubview:superView];

UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(20.f, 20.f, 60.f, 60.f)];
subView.backgroundColor = [UIColor yellowColor];
[superView addSubview:subView];

NSLog(@"superView.frame = %@, superView.bounds = %@", NSStringFromCGRect(superView.frame), NSStringFromCGRect(superView.bounds));
// 輸出: superView.frame = {{20, 20}, {100, 100}}, superView.bounds = {{0, 0}, {100, 100}}
NSLog(@"subView.frame = %@, subView.bounds = %@", NSStringFromCGRect(subView.frame), NSStringFromCGRect(subView.bounds));
// 輸出: subView.frame = {{20, 20}, {60, 60}}, subView.bounds = {{0, 0}, {60, 60}}
父視圖坐標(biāo)系統(tǒng)
// 代碼片段2
UIView *superView = [[UIView alloc] initWithFrame:CGRectMake(20.f, 20.f, 100.f, 100.f)];
superView.backgroundColor = [UIColor redColor];
[self.view addSubview:superView];

UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(20.f, 20.f, 60.f, 60.f)];
subView.backgroundColor = [UIColor yellowColor];
[superView addSubview:subView];

// 新增代碼
superView.bounds = CGRectMake(0, 20, 100, 100);

NSLog(@"superView.frame = %@, superView.bounds = %@", NSStringFromCGRect(superView.frame), NSStringFromCGRect(superView.bounds));
// 輸出: superView.frame = {{20, 20}, {100, 100}}, superView.bounds = {{0, 20}, {100, 100}}
NSLog(@"subView.frame = %@, subView.bounds = %@", NSStringFromCGRect(subView.frame), NSStringFromCGRect(subView.bounds));
// 輸出: subView.frame = {{20, 20}, {60, 60}}, subView.bounds = {{0, 0}, {60, 60}}
自身坐標(biāo)系統(tǒng)

通過以上兩個代碼片段可以看出, superViewbounds.origin發(fā)生變化并不影響其自身所處的位置, 但是卻會影響到subView的位置. 這是因為superViewbounds.origin發(fā)生變化直接導(dǎo)致了自身坐標(biāo)系統(tǒng)的原點發(fā)生了改變, 即通過bounds.origin設(shè)置的值便是superView的左上角在自身坐標(biāo)系統(tǒng)中的位置, 而superView則會根據(jù)自身新的坐標(biāo)系統(tǒng)更新其subView的位置.

注: 本文在此僅涉及bounds屬性的變化對位置的影響, 如果想了解其對尺寸的影響煩請自行Google.

實現(xiàn)原理

通過上一部分內(nèi)容的介紹, 理解UIScrollView用戶界面的實現(xiàn)原理將不再有困難. 其實UIScrollView只是在用戶滾動的時候動態(tài)修改其bounds.origin的值, 這樣便會相應(yīng)地影響子視圖的位置變化, 而其他滑動相關(guān)屬性則均用于約束bounds.origin的變化范圍. 以常用的四個屬性為例:

  • contentOffset: 當(dāng)用戶在scrollView中向上滑動時, 設(shè)置bounds.origin的值逐漸增加, 此時所有的子視圖便會相應(yīng)地向上移動. 其實contentOffset = bounds.origin.
  • contentSize: 由于bounds.origin的值可以隨意變化, 因此scrollView便可以無限制地向四周滾動. 其實contentSize的值便是可滾動范圍的抽象.
  • contentInsetadjustedContentInset: 在不改變contentSize的前提下對可滾動范圍進(jìn)行擴展.
iOS11中的新變化

iOS10及以前, 當(dāng)scrollView所在的控制器位于導(dǎo)航控制器的最頂層時, 系統(tǒng)會通過contentInset屬性自動為scrollView上方增加64pt的可滾動區(qū)域以防內(nèi)容區(qū)域被導(dǎo)航欄遮擋. 該種優(yōu)化方式可以通過設(shè)置控制器的automaticallyAdjustsScrollViewInsets = NO來禁用.

注: 系統(tǒng)只在UIScrollView是控制器視圖的第0個子視圖時才會自動修改其contentInset屬性和scrollIndicatorInsets屬性

iOS11中, 上述優(yōu)化方式被廢棄. 系統(tǒng)通過adjustedContentInset屬性配合contentInsetAdjustmentBehavior屬性來處理scrollView的內(nèi)容區(qū)域超出安全區(qū)域以外的情況, 這是一種對原有優(yōu)化方式的升級, 避免了原有的一刀切的優(yōu)化方式.

adjustedContentInset.png

注: 不要被圖片誤導(dǎo), adjustedContentInset屬性的值是包含contentInset屬性的值的

事件處理相關(guān)

觸摸相關(guān)API介紹

該屬性用于標(biāo)識用戶是否已經(jīng)觸摸了內(nèi)容區(qū)域并準(zhǔn)備進(jìn)行滑動

注: 該屬性值被設(shè)置為YES的時候用戶可能只是觸摸了內(nèi)容區(qū)域, 但是并沒有開始進(jìn)行滑動

@property(nonatomic,readonly,getter=isTracking) BOOL tracking;

該屬性用于標(biāo)識用戶是否已經(jīng)開始滑動內(nèi)容區(qū)域

注: 該屬性值被設(shè)置為YES之前用戶可能需要先滑動一段時間或距離

@property(nonatomic,readonly,getter=isDragging) BOOL dragging;

該屬性用于標(biāo)識是否正在處于減速狀態(tài)(即手指已經(jīng)離開屏幕, 但scrollView仍然處于滑動中)

@property(nonatomic,readonly,getter=isDecelerating) BOOL decelerating;

該屬性用于標(biāo)識是否延遲內(nèi)容區(qū)域的事件傳遞, 默認(rèn)值為YES. 如果設(shè)置為NO, 則scrollView會立即調(diào)用-touchesShouldBegin:withEvent:inContentView:方法以進(jìn)行下一步操作

@property(nonatomic) BOOL delaysContentTouches;

當(dāng)已經(jīng)將事件傳遞給子視圖后是否可以取消, 默認(rèn)值為YES. 如果設(shè)置為NO, 則一旦開始跟蹤事件, 即使手指進(jìn)行移動也不會取消已經(jīng)傳遞給子視圖的事件

@property(nonatomic) BOOL canCancelContentTouches;

該方法用于在UIScrollView的子類中重寫, 返回是否將事件傳遞給對應(yīng)的子視圖, 默認(rèn)返回YES. 如果返回NO, 則該事件不會傳遞給對應(yīng)的子視圖

- (BOOL)touchesShouldBegin:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view;

該方法用于在UIScrollView的子類中重寫, 返回當(dāng)已經(jīng)將事件傳遞給子視圖后是否可以取消. 默認(rèn)當(dāng)子視圖是UIControl時返回NO, 即不再繼續(xù)跟蹤用戶的觸摸事件; 否則返回YES, 即仍然繼續(xù)跟蹤用戶的觸摸事件

注: 該方法被調(diào)用的前提是canCancelContentTouches = YES

- (BOOL)touchesShouldCancelInContentView:(UIView *)view;

其他相關(guān)API介紹

該屬性用于配置隱藏鍵盤的模式, 該屬性可設(shè)置三個枚舉值:

  • UIScrollViewKeyboardDismissModeNone: 默認(rèn)值, 不隱藏鍵盤
  • UIScrollViewKeyboardDismissModeOnDrag: 當(dāng)拖拽時隱藏鍵盤
  • UIScrollViewKeyboardDismissModeInteractive: 當(dāng)拖拽鍵盤上方時隱藏鍵盤, 如果反向拖拽鍵盤會取消隱藏
@property(nonatomic) UIScrollViewKeyboardDismissMode keyboardDismissMode NS_AVAILABLE_IOS(7_0);

該屬性用于標(biāo)識內(nèi)建的拖動手勢和捏合手勢, 可在此對其進(jìn)行配置

@property(nonatomic, readonly) UIPanGestureRecognizer *panGestureRecognizer NS_AVAILABLE_IOS(5_0);
@property(nonatomic, readonly) UIPinchGestureRecognizer *pinchGestureRecognizer NS_AVAILABLE_IOS(5_0);

該屬性用于標(biāo)識內(nèi)建的下拉刷新控件, 可在此實現(xiàn)下拉刷新功能

@property (nonatomic, strong, nullable) UIRefreshControl *refreshControl NS_AVAILABLE_IOS(10_0);

事件處理實現(xiàn)原理

由于scrollView并沒有用于直接操控的滾動條, 因此用戶只能通過直接操作scrollView的內(nèi)容區(qū)域以便進(jìn)行滾動操作. 但是當(dāng)用戶觸碰到屏幕上時, scrollView并不清楚該用戶的目的是想要進(jìn)行滾動操作還是單純地想要點擊某一個視圖. 為了處理這種情況, 當(dāng)用戶觸碰屏幕時, scrollView首先攔截到該觸摸事件并啟用一個150s的定時器, 同時觀察用戶的下一步行為.

  • 當(dāng)定時器結(jié)束前, 如果用戶的觸摸點發(fā)生足夠的移動, 則直接滾動內(nèi)容區(qū)域, 并且不會繼續(xù)將該觸摸事件傳遞給子視圖.
  • 當(dāng)定時器結(jié)束后, 如果用戶的觸摸點并沒有發(fā)生足夠的移動, 則調(diào)用-touchesShouldBegin:withEvent:inContentView:方法詢問是否將事件傳遞給對應(yīng)的子視圖. 如果返回NO, 則該事件不會傳遞給對應(yīng)的子視圖; 如果返回YES, 則該事件會傳遞給對應(yīng)的子視圖, 默認(rèn)為YES.
  • 當(dāng)觸摸事件被傳遞給子視圖后, 如果canCancelContentTouches=YES, 則會立即調(diào)用-touchesShouldCancelInContentView:方法詢問是否可以取消已經(jīng)傳遞給子視圖的事件. 如果返回NO, 則不再進(jìn)一步跟蹤用戶的觸摸事件; 如果返回YES, 則當(dāng)用戶的觸摸點又發(fā)生足夠的移動時, 系統(tǒng)會向該子視圖發(fā)送-touchesCancelled:withEvent:消息并進(jìn)行滑動.

代理相關(guān)

該方法在contentOffset發(fā)生變化時調(diào)用

- (void)scrollViewDidScroll:(UIScrollView *)scrollView;

該方法在將要開始拖拽時調(diào)用

注: 該方法可能需要先滑動一段時間或距離才會被調(diào)用

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;

該方法在用戶停止拖拽時調(diào)用

注: 應(yīng)用程序可以通過修改targetContentOffset參數(shù)的值來調(diào)整停止的位置

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0);

該方法在用戶停止拖拽時調(diào)用

注: 如果在停止拖拽后繼續(xù)移動, 則decelerate參數(shù)為YES

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

該方法在將要開始減速時調(diào)用

注: 僅當(dāng)停止拖拽后繼續(xù)移動時才會被調(diào)用

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;

該方法在已經(jīng)結(jié)束減速時調(diào)用

注: 僅當(dāng)停止拖拽后繼續(xù)移動時才會被調(diào)用

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

該方法用于返回是否允許點擊狀態(tài)欄讓scrollView滑動到頂部, 默認(rèn)值為YES

注: 僅當(dāng)scrollsToTop屬性值為YES時才調(diào)用

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;

該方法在scrollView已經(jīng)滑動到頂部時調(diào)用

注: 僅當(dāng)通過點擊狀態(tài)欄讓scrollView滑動到頂部才調(diào)用

- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;

該方法在-setContentOffset:animated:/-scrollRectVisible:animated:方法動畫結(jié)束時調(diào)用

注: 僅當(dāng)animated設(shè)置為YES時才調(diào)用

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;

該方法在縮放比例發(fā)生變化時調(diào)用

- (void)scrollViewDidZoom:(UIScrollView *)scrollView NS_AVAILABLE_IOS(3_2);

該方法用于返回參與縮放的子視圖

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

該方法在將要開始縮放時調(diào)用

- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view NS_AVAILABLE_IOS(3_2);

該方法在已經(jīng)結(jié)束縮放時調(diào)用

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale;

該方法在adjustedContentInset發(fā)生變化時調(diào)用

- (void)scrollViewDidChangeAdjustedContentInset:(UIScrollView *)scrollView API_AVAILABLE(ios(11.0));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末士骤,一起剝皮案震驚了整個濱河市色徘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件初斑,死亡現(xiàn)場離奇詭異宪肖,居然都是意外死亡,警方通過查閱死者的電腦和手機濒生,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門埋泵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甜攀,你說我怎么就攤上這事秋泄。” “怎么了规阀?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵恒序,是天一觀的道長。 經(jīng)常有香客問我谁撼,道長歧胁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任厉碟,我火速辦了婚禮喊巍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箍鼓。我一直安慰自己崭参,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布款咖。 她就那樣靜靜地躺著何暮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铐殃。 梳的紋絲不亂的頭發(fā)上海洼,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音富腊,去河邊找鬼坏逢。 笑死,一個胖子當(dāng)著我的面吹牛赘被,可吹牛的內(nèi)容都是我干的是整。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼民假,長吁一口氣:“原來是場噩夢啊……” “哼浮入!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阳欲,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舵盈,失蹤者是張志新(化名)和其女友劉穎陋率,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秽晚,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡瓦糟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赴蝇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菩浙。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖句伶,靈堂內(nèi)的尸體忽然破棺而出劲蜻,到底是詐尸還是另有隱情,我是刑警寧澤考余,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布先嬉,位于F島的核電站,受9級特大地震影響楚堤,放射性物質(zhì)發(fā)生泄漏疫蔓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一身冬、第九天 我趴在偏房一處隱蔽的房頂上張望衅胀。 院中可真熱鬧,春花似錦酥筝、人聲如沸滚躯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掸掏。三九已至,卻和暖如春搅幅,著一層夾襖步出監(jiān)牢的瞬間阅束,已是汗流浹背呼胚。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工茄唐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝇更。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓沪编,卻偏偏與公主長得像,于是被迫代替她去往敵國和親年扩。 傳聞我的和親對象是個殘疾皇子蚁廓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容