[iOS] UIKit-UIScrollView

  • 當(dāng)展示的內(nèi)容較多罪帖,超出一個(gè)屏幕時(shí)条辟,用戶可通過滾動(dòng)手勢來查看屏幕以外的內(nèi)容
  • 普通的UIView不具備滾動(dòng)功能冀偶,不適合顯示過多的內(nèi)容
  • UIScrollView是一個(gè)能夠滾動(dòng)的視圖控件鬓梅,可以用來展示大量的內(nèi)容吞获,并且可以通過滾動(dòng)查看所有的內(nèi)容
  • UIScrollView是一個(gè)可以處理滾動(dòng)操作的視圖况凉,UIScrollView在開發(fā)過程中使用很頻繁,而且它也經(jīng)常作為其他控件的子控件各拷,例如UITableView就繼承自UIScrollView刁绒。

常見屬性

屬性 說明
@property(nonatomic) CGPoint contentOffset; 內(nèi)容偏移量,當(dāng)前顯示的內(nèi)容的頂點(diǎn)相對此控件頂點(diǎn)的x烤黍、y距離知市,默認(rèn)為CGPointZero
@property(nonatomic) CGSize contentSize; 控件內(nèi)容大小,不一定在顯示區(qū)域速蕊,如果這個(gè)屬性不設(shè)置嫂丙,此控件無法滾動(dòng),默認(rèn)為CGSizeZero
@property(nonatomic) UIEdgeInsets contentInset; 控件四周邊距规哲,類似于css中的margin,注意邊距不作為其內(nèi)容的一部分,默認(rèn)為UIEdgeInsetsZero
@property(nonatomic,assign) id<UIScrollViewDelegate> delegate; 控件代理跟啤,一般用于事件監(jiān)聽,在iOS中多數(shù)控件都是通過代理進(jìn)行事件監(jiān)聽的
@property(nonatomic) BOOL bounces; 是否啟用彈簧效果唉锌,啟用彈簧效果后拖動(dòng)到邊緣可以看到內(nèi)容后面的背景隅肥,默認(rèn)為YES
@property(nonatomic,getter=isPagingEnabled) BOOL pagingEnabled; 是否分頁,如果分頁的話每次左右拖動(dòng)則移動(dòng)寬度是屏幕寬度整數(shù)倍袄简,默認(rèn)為NO
@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled; 是否啟用滾動(dòng)腥放,默認(rèn)為YES
@property(nonatomic) BOOL showsHorizontalScrollIndicator; 是否顯示橫向滾動(dòng)條,默認(rèn)為YES
@property(nonatomic) BOOL showsVerticalScrollIndicator; 是否顯示縱向滾動(dòng)條绿语,默認(rèn)為YES
@property(nonatomic) CGFloat minimumZoomScale; 最小縮放倍數(shù)秃症,默認(rèn)為1.0
@property(nonatomic) CGFloat maximumZoomScale; 最大縮放倍數(shù)(注意只有maximumZoomScale大于minimumZoomScale才有可能縮放)候址,默認(rèn)為1.0
@property(nonatomic,readonly,getter=isTracking) BOOL tracking; (狀態(tài))是否正在被追蹤,手指按下去并且還沒有拖動(dòng)時(shí)是YES种柑,其他情況均為NO
@property(nonatomic,readonly,getter=isDragging) BOOL dragging; 是否正在被拖拽
@property(nonatomic,readonly,getter=isDecelerating) BOOL decelerating; 是否正在減速
@property(nonatomic,readonly,getter=isZooming) BOOL zooming; 是否正在縮放
  • scrollView不能滾動(dòng)的幾種情況
    1.沒有設(shè)置contentSize
    2.scrollEnabled屬性 = NO
    3.userInteractionEnabled屬性 = NO

  • enabled和userInteractionEnabled的區(qū)別

    • enabled: 代表控件不可用
    • userInteractionEnabled: 代表控件不可以和用戶交互宗雇,也就是不能響應(yīng)用戶的操作
contentSize、contentInset莹规、contentOffset

contentInset相當(dāng)于在內(nèi)容大小contentSize的基礎(chǔ)上增加了一塊額外的滾動(dòng)區(qū)域,是額外的泌神,所以和contentSize良漱、contentOffset都沒有直接的關(guān)系。

contentOffset

下面用圖來表達(dá)contentOffset欢际,其中母市,綠色矩形是scrollview,透明紅矩形是scrollview的內(nèi)容

圖1 - 內(nèi)容在右上角损趋,contentOffset = (100患久,100)
圖2 -內(nèi)容在左下角,contentOffset = (-100浑槽,-100)
  • 如圖1蒋失,內(nèi)容左上角是(-100, -100),則
    contentOffset = (0, 0) - (-100, -100) = (0 - -100, 0 - -100) = (100, 100)
  • 如圖2桐玻,內(nèi)容的左上角是(100, 100)篙挽,則
    contentOffset = (0, 0) - (100, 100) = (0 - 100, 0 - 100) = (-100, -100)
  • 所以,contentOffset = 控件左上角(0, 0) - 內(nèi)容左上角

記啄餮ァ铣卡!
contentOffset = 控件左上角(0, 0) - 內(nèi)容左上角
contentOffset.x > 0 ,內(nèi)容左移
contentOffset.x < 0 偏竟,內(nèi)容右移
contentOffset.y > 0 煮落,內(nèi)容上移
contentOffset.y < 0 ,內(nèi)容下移

常用方法

方法 說明
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated; 設(shè)置滾動(dòng)位置踊谋,第二個(gè)參數(shù)表示是否啟用動(dòng)畫效果
- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated; 滾動(dòng)并顯示指定區(qū)域的內(nèi)容蝉仇,第二個(gè)參數(shù)表示是否啟用動(dòng)畫效果

常見代理方法

代理方法 說明
- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 滾動(dòng)事件方法,滾動(dòng)過程中會(huì)一直循環(huán)執(zhí)行(滾動(dòng)中…)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView; 開始拖拽事件方法
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate; 拖拽操作完成事件方法
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView; 即將停止?jié)L動(dòng)事件方法(拖拽松開后開始減速時(shí)執(zhí)行)
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 滾動(dòng)停止事件方法(滾動(dòng)過程中減速停止后執(zhí)行)
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view NS_AVAILABLE_IOS(3_2); 開始縮放事件方法
- (void)scrollViewDidZoom:(UIScrollView *)scrollView NS_AVAILABLE_IOS(3_2); 縮放操作完成事件方法
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView; 返回縮放視圖褪子,注意只有實(shí)現(xiàn)這個(gè)代理方法才能進(jìn)行縮放量淌,此方法返回需要縮放的視圖
方法的調(diào)用順序
拖動(dòng)UIScrollview

如果我們拖動(dòng)一個(gè)UIScrollView中的子控件移動(dòng)的時(shí)候它的執(zhí)行順序如下:

  1. 開始拖拽,
  2. 滾動(dòng)...嫌褪,
  3. 停止拖拽呀枢,
  4. 將要停止?jié)L動(dòng),
  5. 滾動(dòng)...
  6. 停止?jié)L動(dòng)

其中步驟4笼痛、5和6有可能執(zhí)行也有可能不執(zhí)行裙秋,關(guān)鍵看你拖拽的停止的時(shí)候是突然停止(沒有慣性)還是有一段慣性讓他繼續(xù)執(zhí)行(有慣性)琅拌。但是不管怎么樣滾動(dòng)事件會(huì)一直執(zhí)行,因此如果在這個(gè)事件中進(jìn)行某種操作一定要注意性能摘刑。

  • 如果想在UIScrollView停止?jié)L動(dòng)之后做一些操作, 有兩種情況
  1. 沒有慣性的情況:只會(huì)調(diào)用 停止拖拽的方法进宝,不會(huì)調(diào)用停止減速的方法
  2. 有慣性的情況:既會(huì)調(diào)用 停止拖拽的方法,也會(huì)調(diào)用停止減速的方法
    所以:以后要判斷UIScrollView是否停止?jié)L動(dòng)枷恕,需要同時(shí)重寫兩個(gè)方法
    2.1 scrollViewDidEndDragging
    2.2 scrollViewDidEndDecelerating
  • 優(yōu)化停止方法党晋,使得只需寫一次滾動(dòng)停止的操作
// 結(jié)束拖拽
    -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
        if (decelerate == NO) {  // 如果不是減速,也就是沒有慣性 
        // 主動(dòng)調(diào)用結(jié)束減速方法徐块,所有的滾動(dòng)停止后操作都在那個(gè)方法中執(zhí)行
        [self scrollViewDidEndDecelerating:scrollView];
        }
    }
// 結(jié)束減速
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
        // 在這里寫停止?jié)L動(dòng)后的相關(guān)操作
    }
縮放UIScrollview
  • 如果我們縮放UIScrollView的子控件的時(shí)候它的執(zhí)行順序如下:
    1. 開始縮放
    2. 滾動(dòng)…
    3. 停止縮放
  • 同樣在這個(gè)過程中滾動(dòng)事件會(huì)一直調(diào)用(當(dāng)然如果縮放過程中手指有別的動(dòng)作也可能會(huì)觸發(fā)其他事件未玻,這個(gè)大家可以自己體會(huì))。
// 1.設(shè)置縮放大小
  srcollView.maximumZoomScale = 2.0;
  srcollView.minimumZoomScale = 1;
// 2.設(shè)置需要縮放的控件
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return self.imageView;
}

無限循環(huán)輪播器

  • 在UIScrollView中如果放置其他控件后胡控,只要設(shè)置contentSize之后這些圖片就可以滾動(dòng)扳剿。如果要讓圖片無限循環(huán)那么只有兩種辦法,一種是無限循環(huán)疊加圖片昼激,另一種就是如果最后一張圖片瀏覽完立即顯示第一張圖片庇绽。顯然第一種明顯不合適,考慮第二種橙困。

  • 使用第二種原理其實(shí)很簡單瞧掺,就是前后各加一張(n+2)。比如有5張圖片那么久需要7個(gè)UIImageView纷宇,圖片分別是圖片5夸盟,圖片1,圖片2像捶,圖片3上陕,圖片4,圖片5拓春,圖片0释簿。

  • 當(dāng)從圖片1滾動(dòng)到圖片5時(shí)由于最后一張是圖片1就給用戶一種無限循環(huán)的感覺,當(dāng)這張圖完全顯示后我們迅速將UIScrollView的contentOffset設(shè)置到第二個(gè)UIImageView硼莽,也就是圖片1庶溶,接著用戶可以繼續(xù)向后滾動(dòng)。當(dāng)然向前滾動(dòng)原理完全一樣懂鸵,當(dāng)滾動(dòng)到第一張圖片(圖片5)就迅速設(shè)置UIScrollView的contentOffset顯示第6張圖(圖片5)偏螺。

  • 性能優(yōu)化

  • 用上面的方法的話,需要過多這些圖片匆光,而這樣勢必全部加載到內(nèi)存套像,這是我們不愿意看到的,此時(shí)需要優(yōu)化终息。其實(shí)只需要3個(gè)UIImageView(2個(gè)也可以)同樣可以實(shí)現(xiàn)上面的效果夺巩。只是每次滾動(dòng)后贞让,都需要重新設(shè)置圖片。例如開始的時(shí)候柳譬,是圖片5喳张,圖片1,圖片2美澳。向后滾動(dòng)销部,那么三種圖分別的序號就是1,2制跟,3柴墩,然后通過contentOffset設(shè)置顯示中間的UIImageView。當(dāng)然凫岖,向前滾動(dòng)原理完全一樣,如此就給用戶一種循環(huán)錯(cuò)覺逢净,而且不占用過多內(nèi)存哥放。

在程序中,讀取寫入了圖片信息的plist文件并加載對應(yīng)的圖片爹土,圖片按順序依次命名:page0.jpg甥雕、page1.jpg…page4.jpg。我們的程序主要集中于自定義的ViewController.m中胀茵,在這里我們聲明1個(gè)UIScrollView和3個(gè)UIImageView用于顯示圖片社露,同時(shí)聲明一個(gè)UIPageControl來顯示當(dāng)前圖片頁數(shù),具體代碼如下:

#import "ViewController.h"

@interface ViewController ()<UIScrollViewDelegate>

/** 所有圖片*/
@property (nonatomic, strong) NSDictionary *images;
/** 圖片個(gè)數(shù)*/
@property (nonatomic, assign) int imageCount;

/** 輪播器*/
@property (nonatomic, weak) UIScrollView *cycleScrollView;
/** 左邊的圖控件*/
@property (nonatomic, weak) UIImageView *leftImageView;
@property (nonatomic, weak) UIImageView *midImageView;
@property (nonatomic, weak) UIImageView *rightImageView;

/** 圖片索引*/
@property (nonatomic, assign) int imageIndex;

// 包裝view需要裝下scrollview和pageControl
/** 包裝view*/
@property (nonatomic, weak) UIView *backGroundView;

/** 分頁控件*/
@property (nonatomic, weak) UIPageControl *pageC;

@end

@implementation ViewController

#define SCREEN_WIDTH self.view.bounds.size.width
#define SCREEN_HEIGHT self.view.bounds.size.height
#define IMAGEVIEW_COUNT 3
#define ScrollView_HEIGHT (200 * (SCREEN_WIDTH) / 320)

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 加載圖片數(shù)據(jù)
    [self loadImageData];
    
    // 添加滾動(dòng)圖
    [self createScrollView];
    
    // 給滾動(dòng)圖添加圖片控件
    [self addImageViewToScrollView];
    
    // 添加分頁控件
    [self addPageControl];
    
    // 加載默認(rèn)圖片
    [self setDefaultImages];
    
    
}

// 加載圖片數(shù)據(jù)
-(void)loadImageData {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"CycleScrollImages" ofType:@"plist"];
    self.images = [NSDictionary dictionaryWithContentsOfFile:path];
    self.imageCount = (int)self.images.count;
}

// 添加滾動(dòng)圖
-(void)createScrollView {
    // 創(chuàng)建包含的view
    UIView *bV = [[UIView alloc] init];
    bV.frame = CGRectMake(0, 20, SCREEN_WIDTH, ScrollView_HEIGHT);
    [self.view addSubview:bV];
    self.backGroundView = bV;
    
    UIScrollView *scrollView = [[UIScrollView alloc] init];
    scrollView.frame = CGRectMake(0, 0, SCREEN_WIDTH, ScrollView_HEIGHT);
    scrollView.backgroundColor = [UIColor redColor];
    scrollView.contentSize = CGSizeMake(SCREEN_WIDTH * IMAGEVIEW_COUNT, 0);
    scrollView.pagingEnabled = YES;
    scrollView.delegate = self;
    scrollView.bounces = NO;
    [scrollView setContentOffset:CGPointMake(SCREEN_WIDTH, 0)];
    [self.backGroundView addSubview:scrollView];
    
    self.cycleScrollView = scrollView;
}

// 給滾動(dòng)圖添加圖片控件
-(void)addImageViewToScrollView {

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, ScrollView_HEIGHT)];
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    [self.cycleScrollView addSubview:imageView];
    self.leftImageView = imageView;
    
    imageView = [[UIImageView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH, 0, SCREEN_WIDTH, ScrollView_HEIGHT)];
    [self.cycleScrollView addSubview:imageView];
    self.midImageView = imageView;
    
    imageView = [[UIImageView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH * 2, 0, SCREEN_WIDTH, ScrollView_HEIGHT)];
    [self.cycleScrollView addSubview:imageView];
    self.rightImageView = imageView;
}

// 添加分頁控件
-(void)addPageControl {
    
    int count = self.imageCount;
    UIPageControl *pageC = [[UIPageControl alloc] init];
    CGSize size = [pageC sizeForNumberOfPages:count];
    pageC.bounds = CGRectMake(0, 0, size.width, size.height);
    pageC.center = CGPointMake(SCREEN_WIDTH * 0.5, ScrollView_HEIGHT - size.height - 10);
    //設(shè)置顏色
    pageC.pageIndicatorTintColor=[UIColor colorWithRed:193/255.0 green:219/255.0 blue:249/255.0 alpha:1];
    //設(shè)置當(dāng)前頁顏色
    pageC.currentPageIndicatorTintColor=[UIColor colorWithRed:0 green:150/255.0 blue:1 alpha:1];
    //設(shè)置總頁數(shù)
    pageC.numberOfPages = count;
    
    pageC.backgroundColor = [UIColor redColor];
    [self.backGroundView addSubview:pageC];
    
    self.pageC = pageC;
}

// 加載默認(rèn)圖片
-(void)setDefaultImages {
    self.leftImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"page%d.jpg",self.imageCount - 1]];
    self.midImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"page%d.jpg",0]];
    self.rightImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"page%d.jpg",1]];
    
    
    self.imageIndex = 0;
    [self.pageC setCurrentPage:0];
    
}

// 重新讀取圖片
-(void)reloadImages {
    int leftImageIndex, rightImageIndex;
    CGPoint currentP = [self.cycleScrollView contentOffset];
    if (currentP.x < SCREEN_WIDTH) { // 滾到左邊
        self.imageIndex = (self.imageIndex + self.imageCount -1) % self.imageCount;
    } else if(currentP.x > SCREEN_WIDTH) { // 滾到右邊
        self.imageIndex = (self.imageIndex + 1) % self.imageCount;
    }
    leftImageIndex = (self.imageIndex + self.imageCount -1) % self.imageCount;
    rightImageIndex = (self.imageIndex + 1) % self.imageCount;
    
    
    self.midImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"page%d.jpg",self.imageIndex]];
    self.leftImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"page%d.jpg",leftImageIndex]];
    self.rightImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"page%d.jpg",rightImageIndex]];
}

#pragma mark - UIScrollViewDelegate

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    if (decelerate == NO) {
        [self scrollViewDidEndDecelerating:scrollView];
    }
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    // 滾完之后
    // 重新讀取圖片
    [self reloadImages];
    
    // 滾回中間
    [scrollView setContentOffset:CGPointMake(SCREEN_WIDTH, 0)];
    
    // 設(shè)置分頁控件的序數(shù)
    [self.pageC setCurrentPage:self.imageIndex];
}

@end
效果圖1

注意:這里只是簡單實(shí)現(xiàn)思路琼娘,沒有封裝好峭弟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脱拼,隨后出現(xiàn)的幾起案子瞒瘸,更是在濱河造成了極大的恐慌,老刑警劉巖熄浓,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件情臭,死亡現(xiàn)場離奇詭異,居然都是意外死亡赌蔑,警方通過查閱死者的電腦和手機(jī)俯在,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娃惯,“玉大人跷乐,你說我怎么就攤上這事∈埃” “怎么了劈猿?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵拙吉,是天一觀的道長。 經(jīng)常有香客問我揪荣,道長筷黔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任仗颈,我火速辦了婚禮佛舱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挨决。我一直安慰自己请祖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布脖祈。 她就那樣靜靜地躺著肆捕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盖高。 梳的紋絲不亂的頭發(fā)上慎陵,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音喻奥,去河邊找鬼席纽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撞蚕,可吹牛的內(nèi)容都是我干的润梯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼甥厦,長吁一口氣:“原來是場噩夢啊……” “哼纺铭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刀疙,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤彤蔽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后庙洼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顿痪,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年油够,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚁袭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡石咬,死狀恐怖霸奕,靈堂內(nèi)的尸體忽然破棺而出桐经,到底是詐尸還是另有隱情崇决,我是刑警寧澤锈死,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布抵赢,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜维贺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巴帮。 院中可真熱鬧溯泣,春花似錦、人聲如沸榕茧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽用押。三九已至肢簿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜻拨,已是汗流浹背译仗。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留官觅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓阐污,卻偏偏與公主長得像休涤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子笛辟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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