UITableView+FDTemplateLayoutCell 配合AutoLayout UITableViewCell動態高度自適應

<article>

每個App的搜索界面下邊都會有熱門搜索,歷史搜索之類的標簽,這里介紹個框架,

既可以非常容易實現標簽類的不規則流式布局,也可以實現固定寬度和高度的布局,也

支持Autolayout,使用起來也是非常舒服。SKTagView原框架下只有根據文字寬度不固

定的的模式,那么如果需求有固定寬高模式的[圖片上傳失敗...(image-21f1d6-1523326930882)]

,老規矩,只能改源碼了.

請看圖:

[圖片上傳失敗...(image-2cb030-1523326930882)]

[圖片上傳失敗...(image-fb582c-1523326930882)]

[圖片上傳失敗...(image-b6d96f-1523326930882)]

傳統模式:

[圖片上傳失敗...(image-af9122-1523326930882)]

TableView cell模式的不規則模式和固定寬高模式:[圖片上傳失敗...(image-1147c4-1523326930882)]

[圖片上傳失敗...(image-9b1050-1523326930882)]

[圖片上傳失敗...(image-af421a-1523326930882)]

[圖片上傳失敗...(image-926856-1523326930882)]

電影放完了,開始簡單介紹下

這里有兩個能用到的地方(截圖來自淘寶)

**[圖片上傳失敗...(image-110276-1523326930876)]

[圖片上傳失敗...(image-c0cfc6-1523326930876)]**

OK,根據以上兩個用途,寫了兩個簡單的Demo,無需再繁瑣的計算了,直接導入

SKTagView來進行布局,非常簡單

Demo地址:https://github.com/DeftMKJ/SKTag

Demo1

首先:

創建一個UISearchBar來進行模擬搜索

[objc] view plain copy

<embed id="ZeroClipboardMovie_1" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_1" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

    • (void)viewDidLoad {
  1. [super viewDidLoad];
  2. // Do any additional setup after loading the view from its nib.
  3. UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 375, 44)];
  4. titleView.backgroundColor = [UIColor clearColor];
  5. self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 360, 44)];
  6. self.searchBar.delegate = self;
  7. self.searchBar.placeholder = @"請輸入要搜索的文字";
  8. // self.searchBar.showsCancelButton = YES;
  9. // 鍵盤確認按鈕的名字
  10. self.searchBar.returnKeyType = UIReturnKeyNext;
  11. // 把默認灰色背景浮層給去掉
  12. self.searchBar.backgroundColor = [UIColor clearColor];
  13. self.searchBar.backgroundImage = [UIImage new];
  14. UITextField *searBarTextField = [self.searchBar valueForKey:@"_searchField"];
  15. if (searBarTextField)
  16. {
  17. [searBarTextField setBackgroundColor:[UIColor colorWithRed:243/255.0 green:243/255.0 blue:243/255.0 alpha:1]];
  18. searBarTextField.borderStyle = UITextBorderStyleRoundedRect;
  19. searBarTextField.layer.cornerRadius = 5.0f;
  20. }
  21. else
  22. {
  23. // 通過顏色畫一個Image出來
  24. UIImage *image = [UIImage imageWithColor:[UIColor colorWithRed:243/255.0 green:243/255.0 blue:243/255.0 alpha:1] forSize:CGSizeMake(28, 28)];
  25. [self.searchBar setSearchFieldBackgroundImage:image forState:UIControlStateNormal];
  26. }
  27. [titleView addSubview:self.searchBar];
  28. self.navigationItem.titleView = titleView;
  29. [self.searchBar becomeFirstResponder];
  30. [self configTagView];
  31. }

來看看效果哈

[圖片上傳失敗...(image-c7d32b-1523326930881)]

但是你們有沒有覺得他右邊的Cancel一點都協調么,要改了它,但是這東西

系統又沒有給屬性接口讓你改......

[圖片上傳失敗...(image-510a7d-1523326930885)]

[圖片上傳失敗...(image-31416c-1523326930885)]

那么試著咱們把SearchBar下面的Subviews統統打印出來看一下

[圖片上傳失敗...(image-dcdd34-1523326930875)]

咦???這個數組里面只有個UIView么,不科學啊,要不再撥開一層看看[圖片上傳失敗...(image-408763-1523326930872)]

[圖片上傳失敗...(image-6f424-1523326930875)]

**[圖片上傳失敗...(image-8279f8-1523326930872)]

NICE啊,這波操作可以啊,找到了,藏那么里面,既然找到了,就在這個代理方法里面進行修改**

[objc] view plain copy

<embed id="ZeroClipboardMovie_2" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_2" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

    • (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
  1. // (lldb) po self.searchBar.subviews[0].subviews

  2. // <__NSArrayM 0x7ffba1e08330>(

  3. // <UISearchBarBackground: 0x7ffba1c670e0; frame = (0 0; 360 44); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7ffba1c201a0>>,

  4. // <UISearchBarTextField: 0x7ffba1c905b0; frame = (0 0; 0 0); text = ''; clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x7ffba1c90360>>,

  5. // <UINavigationButton: 0x7ffba1c982c0; frame = (0 0; 53 30); opaque = NO; layer = <CALayer: 0x7ffba1c98800>>

  6. // )

  7. //

  8. // (lldb) po self.searchBar.subviews

  9. // <__NSArrayM 0x7ffba1e77280>(

  10. // <UIView: 0x7ffba1c8a470; frame = (0 0; 360 44); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x7ffba1c7ddc0>>

  11. // )

  12. searchBar.showsCancelButton = YES;

  13. for(UIView *view in [[[searchBar subviews] objectAtIndex:0] subviews]) {

  14. if([view isKindOfClass:[NSClassFromString(@"UINavigationButton") class]]) {

  15. UIButton * cancel =(UIButton *)view;

  16. [cancel setTitle:@"搜索" forState:UIControlStateNormal];

  17. cancel.titleLabel.font = [UIFont systemFontOfSize:14];

  18. cancel.tintColor = [UIColor redColor];

  19. }

  20. }}

**修改完后的效果(Mac這截圖效果也是醉了[圖片上傳失敗...(image-638db2-1523326930871)]

)**

[圖片上傳失敗...(image-9d3fd1-1523326930884)]

然后

我們來創建SKTagView,各種屬性已經加上注釋

[objc] view plain copy

<embed id="ZeroClipboardMovie_3" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_3" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

  1. // 配置

    • (void)configTagView
  2. {

  3. self.label = [[UILabel alloc] initWithFrame:CGRectMake(10, 90, 100, 30)];

  4. self.label.textColor = [UIColor blackColor];

  5. self.label.font = [UIFont systemFontOfSize:13];

  6. self.label.text = @"歷史搜索";

  7. [self.view addSubview:self.label];

  8. // 先移除掉所有

  9. [self.tagView removeAllTags];

  10. // 初始化

  11. self.tagView = [[SKTagView alloc] init];

  12. // 整個tagView對應其SuperView的上左下右距離

  13. self.tagView.padding = UIEdgeInsetsMake(10, 10, 10, 10);

  14. // 上下行之間的距離

  15. self.tagView.lineSpacing = 10;

  16. // item之間的距離

  17. self.tagView.interitemSpacing = 20;

  18. // 最大寬度

  19. self.tagView.preferredMaxLayoutWidth = 375;

  20. // @property (assign, nonatomic) CGFloat regularWidth; //!< 固定寬度

  21. // @property (nonatomic,assign ) CGFloat regularHeight; //!< 固定高度

  22. // 原作者沒有能加固定寬度的,自己修改源碼加上了固定寬度和高度,默認是0,就是標簽式布局,如果實現了,那么就是固定寬度高度

  23. // self.tagView.regularWidth = 100;

  24. // self.tagView.regularHeight = 30;

  25. // 開始加載

  26. [self.dataSource enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOLBOOL * _Nonnull stop) {

  27. // 初始化標簽

  28. SKTag *tag = [[SKTag alloc] initWithText:self.dataSource[idx]];

  29. // 標簽相對于自己容器的上左下右的距離

  30. tag.padding = UIEdgeInsetsMake(3, 15, 3, 15);

  31. // 弧度

  32. tag.cornerRadius = 3.0f;

  33. // 字體

  34. tag.font = [UIFont boldSystemFontOfSize:12];

  35. // 邊框寬度

  36. tag.borderWidth = 0;

  37. // 背景

  38. tag.bgColor = [UIColor colorWithRed:244/255.0 green:244/255.0 blue:244/255.0 alpha:1];

  39. // 邊框顏色

  40. tag.borderColor = [UIColor colorWithRed:191/255.0 green:191/255.0 blue:191/255.0 alpha:1];

  41. // 字體顏色

  42. tag.textColor = [UIColor colorWithRed:53/255.0 green:53/255.0 blue:53/255.0 alpha:1];

  43. // 是否可點擊

  44. tag.enable = YES;

  45. // 加入到tagView

  46. [self.tagView addTag:tag];

  47. }];

  48. // 點擊事件回調

  49. self.tagView.didTapTagAtIndex = ^(NSUInteger idx){

  50. NSLog(@"點擊了第%ld個",idx);

  51. };

  52. // 獲取剛才加入所有tag之后的內在高度

  53. CGFloat tagHeight = self.tagView.intrinsicContentSize.height;

  54. NSLog(@"高度%lf",tagHeight);

  55. // 根據已經得到的內在高度給SKTagView創建frame

  56. self.tagView.frame = CGRectMake(0, 120, 375, tagHeight);

  57. [self.tagView layoutSubviews];

  58. [self.view addSubview:self.tagView];

  59. }

最后

在UISearchBar的代理方法里面實現搜索的時候隱藏,不搜索的時候顯示

[objc] view plain copy

<embed id="ZeroClipboardMovie_4" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_4" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

    • (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
  1. {
  2. NSLog(@"%@",searchText);
  3. if (searchText.length == 0) {
  4. // 沒有文字了
  5. self.label.hidden = NO;
  6. self.tagView.hidden = NO;
  7. }
  8. else
  9. {
  10. self.label.hidden = YES;
  11. self.tagView.hidden = YES;
  12. }
  13. }

三步做完,一個簡單的Demo就做完了,簡單到爆......

下面咱們來看看如何讓他在TableViewCell里面實現高度自適應的

(需要用到的庫UITableView+FDTemplateLayoutCell--->傳送門

Demo2

首先

用Xib做一個SKTagView的Cell

[圖片上傳失敗...(image-36df22-1523326930874)]

然后

不需要給SKTagView指定Frame了,約束已經做好,只要實現下面的代碼就好了

[objc] view plain copy

<embed id="ZeroClipboardMovie_5" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_5" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

    • (void)configCell:(MKJTagViewTableViewCell *)cell indexpath:(NSIndexPath *)indexpath
  1. {

  2. [cell.tagView removeAllTags];

  3. cell.tagView.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width;

  4. cell.tagView.padding = UIEdgeInsetsMake(20, 20, 20, 20);

  5. cell.tagView.lineSpacing = 20;

  6. cell.tagView.interitemSpacing = 30;

  7. cell.tagView.singleLine = NO;

  8. // 給出兩個字段,如果給的是0,那么就是變化的,如果給的不是0,那么就是固定的

  9. cell.tagView.regularWidth = 80;

  10. cell.tagView.regularHeight = 30;

  11. NSArray *arr = [self.dataSource[indexpath.row] valueForKey:@"first"];

  12. [arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOLBOOL * _Nonnull stop) {

  13. SKTag *tag = [[SKTag alloc] initWithText:arr[idx]];

  14. tag.font = [UIFont systemFontOfSize:12];

  15. tag.textColor = [UIColor colorWithRed:arc4random() % 256 / 255.0 green:arc4random() % 256 / 255.0 blue:arc4random() % 256 / 255.0 alpha:1];

  16. tag.bgColor =[UIColor colorWithRed:arc4random() % 256 / 255.0 green:arc4random() % 256 / 255.0 blue:arc4random() % 256 / 255.0 alpha:1];

  17. tag.cornerRadius = 5;

  18. tag.enable = YES;

  19. tag.padding = UIEdgeInsetsMake(5, 10, 5, 10);

  20. [cell.tagView addTag:tag];

  21. }];

  22. cell.tagView.didTapTagAtIndex = ^(NSUInteger index)

  23. {

  24. NSLog(@"點擊了%ld",index);

  25. };

  26. }

    • (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  27. {

  28. return [tableView fd_heightForCellWithIdentifier:identyfy configuration:^(id cell) {

  29. [self configCell:cell indexpath:indexPath];

  30. }];

  31. }

差不多兩個簡單的Demo就介紹到這里了,再提一點東西,原作者是沒有固定寬度這個屬性的,沒辦法,自己動手豐衣足食了,我改了下源碼,主要加了兩個字段,默認是0,那么出來的效果就是不規則的,寬度隨文字而變化,如果賦值這兩個字段,那么就是固定寬高,上面已經給出了效果圖

[objc] view plain copy

<embed id="ZeroClipboardMovie_6" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_6" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=6&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

  1. @property (assign, nonatomic) CGFloat regularWidth; //!< 固定寬度
  2. @property (nonatomic,assign ) CGFloat regularHeight; //!< 固定高度

給BOOL屬性進行復賦值

[objc] view plain copy

<embed id="ZeroClipboardMovie_7" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_7" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=7&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

  1. @interface SKTagView ()

  2. @property (strong, nonatomic, nullable) NSMutableArray *tags;

  3. @property (assign, nonatomic) BOOL didSetup;

  4. @property (nonatomic,assign) BOOL isIntrinsicWidth; //!<是否寬度固定

  5. @property (nonatomic,assign) BOOL isIntrinsicHeight; //!<是否高度固定

  6. @end

  7. @implementation SKTagView

  8. // 重寫setter給bool賦值

    • (void)setRegularWidth:(CGFloat)intrinsicWidth
  9. {

  10. if (_regularWidth != intrinsicWidth) {

  11. _regularWidth = intrinsicWidth;

  12. if (intrinsicWidth == 0) {

  13. self.isIntrinsicWidth = NO;

  14. }

  15. else

  16. {

  17. self.isIntrinsicWidth = YES;

  18. }

  19. }

  20. }

主要在下面這個放里面引入了兩個判斷

CGFloat width1 = self.isIntrinsicWidth?self.regularWidth:size.width;

CGFloat height1 = self.isIntrinsicHeight?self.regularHeight:size.height;

[objc] view plain copy

<embed id="ZeroClipboardMovie_8" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_8" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

  1. pragma mark - Private

    • (void)layoutTags {
  2. if (self.didSetup || !self.tags.count) {

  3. return;

  4. }

  5. NSArray *subviews = self.subviews;

  6. UIView *previousView = nil;

  7. CGFloat topPadding = self.padding.top;

  8. CGFloat leftPadding = self.padding.left;

  9. CGFloat rightPadding = self.padding.right;

  10. CGFloat itemSpacing = self.interitemSpacing;

  11. CGFloat lineSpacing = self.lineSpacing;

  12. CGFloat currentX = leftPadding;

  13. if (!self.singleLine && self.preferredMaxLayoutWidth > 0) {

  14. for (UIView *view in subviews) {

  15. CGSize size = view.intrinsicContentSize;

  16. CGFloat width1 = self.isIntrinsicWidth?self.regularWidth:size.width;

  17. CGFloat height1 = self.isIntrinsicHeight?self.regularHeight:size.height;

  18. if (previousView) {

  19. // CGFloat width = size.width;

  20. currentX += itemSpacing;

  21. if (currentX + width1 + rightPadding <= self.preferredMaxLayoutWidth) {

  22. view.frame = CGRectMake(currentX, CGRectGetMinY(previousView.frame), width1, height1);

  23. currentX += width1;

  24. } else {

  25. CGFloat width = MIN(width1, self.preferredMaxLayoutWidth - leftPadding - rightPadding);

  26. view.frame = CGRectMake(leftPadding, CGRectGetMaxY(previousView.frame) + lineSpacing, width, height1);

  27. currentX = leftPadding + width;

  28. }

  29. } else {

  30. CGFloat width = MIN(width1, self.preferredMaxLayoutWidth - leftPadding - rightPadding);

  31. view.frame = CGRectMake(leftPadding, topPadding, width, height1);

  32. currentX += width;

  33. }

  34. previousView = view;

  35. }

  36. } else {

  37. for (UIView *view in subviews) {

  38. CGSize size = view.intrinsicContentSize;

  39. view.frame = CGRectMake(currentX, topPadding, self.isIntrinsicWidth?self.regularWidth:size.width, self.isIntrinsicHeight?self.regularHeight:size.height);

  40. currentX += self.isIntrinsicWidth?self.regularWidth:size.width;

  41. previousView = view;

  42. }

  43. }

  44. self.didSetup = YES;

  45. }

介紹完啦,各位還需要細看的請點擊傳送門跑起來看看,不早啦,各位晚安~~~~~~

OVER~~~~~~
安靜
安靜
安靜
安靜
安靜
安靜

[圖片上傳失敗...(image-a1d648-1523326930876)]

</article>

版權聲明:本文為博主原創文章,未經博主允許不得轉載。轉載請Email我....... https://blog.csdn.net/Deft_MKJing/article/details/51722157

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容