D18:圖文混排(自動調(diào)節(jié)高度)和多媒體

目錄

一. 圖文混排(自動調(diào)整cell高度)

  1. 創(chuàng)建導航控制器, 建立模型
  2. 下載數(shù)據(jù), 解析XML, 獲得數(shù)據(jù)源
  3. 創(chuàng)建cell, 實現(xiàn)自動調(diào)節(jié)高度的功能
  4. tableView的代理方法中與之前項目的不同之處
  5. 去除自動布局, 使cell能正常顯示

二. 多媒體

  1. 從相冊選擇圖片
  2. 播放本地音頻
  3. 播放視頻
  4. 錄音
  5. 拍照
  6. 錄視頻

一. 圖文混排(自動調(diào)整cell高度)

  1. 創(chuàng)建導航控制器, 建立模型
  2. 下載數(shù)據(jù), 解析XML, 獲得數(shù)據(jù)源
  3. 創(chuàng)建cell, 實現(xiàn)自動調(diào)節(jié)高度的功能
     @implementation TweetCell
     
     - (void)showData:(TweetModel *)model
     {
         [self.headImageView sd_setImageWithURL:[NSURL URLWithString:model.portrait]];
         self.nameLabel.text = model.author;
         self.commentCountLabel.text = model.commentCount;
         
         // 存儲當前的y值
         CGFloat y = 40;
     
     #warning
         // 描述
         // 計算描述文字的高度
         /* 
          第一個參數(shù): 文字顯示的最大范圍
          第二個參數(shù): 計算文字高度的方式
          第三個參數(shù): 文字的屬性(字體大小等等)
          第四個參數(shù): 上下文(nil)
          */
         NSDictionary *dict = @{NSFontAttributeName:[UIFont systemFontOfSize:16]};
         CGRect bodyFrame = [model.body boundingRectWithSize:CGSizeMake(270, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil];
         CGFloat bodyH = bodyFrame.size.height;
         
         // 設(shè)置文字的大小
         self.descLabel.text = model.body;
         self.descLabel.font = [UIFont systemFontOfSize:16];
         self.descLabel.numberOfLines = 0;
         
         CGRect descFrame = self.descLabel.frame;
         descFrame.size.height = bodyH;
         self.descLabel.frame = descFrame;
         
         // 更新當前的y值
         y += (bodyH + 10);
         
         // 圖片
         if (model.imgSmall.length > 0) {
             // 有圖片 顯示圖片
             [self.smallImageView sd_setImageWithURL:[NSURL URLWithString:model.imgSmall]];
             
             // 修改圖片的位置
             CGRect imageFrame = self.smallImageView.frame;
             imageFrame.origin.y = y;
             self.smallImageView.frame = imageFrame;
             
             // 更新當前的y值
             y += (60 + 10);
             
             self.smallImageView.hidden = NO;
         } else {
             self.smallImageView.hidden = YES;
         }
         
         // 時間
         NSDateFormatter *df = [[NSDateFormatter alloc] init];
         // hh表示12小時制
         [df setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
         
         // 把日期的字符串轉(zhuǎn)化為時間對象
         NSDate *pubDate = [df dateFromString:model.pubDate];
         
         // 計算時間差
         NSDate *nowDate = [NSDate date];
         NSTimeInterval time = [nowDate timeIntervalSinceDate:pubDate];
         
         // 顯示時間文字的字符串
         NSMutableString *timeString = [NSMutableString string];
         
         if (time > 3600) {
             int hour = (int)time / 3600;
             [timeString appendFormat:@"%d小時前", hour];
         } else if (time >= 60) {
             int min = (int)time / 60;
             [timeString appendFormat:@"%d分鐘前", min];
         } else {
             [timeString appendFormat:@"%d秒前", (int)time];
         }
         
         // 來自的客戶端
         if ([model.appclient isEqualToString:@"3"]) {
             [timeString appendString:@"  來自iPhone客戶端"];
         } else if ([model.appclient isEqualToString:@"4"]) {
             [timeString appendString:@"  來自Android客戶端"];
         }
         
         self.timeLabel.text = timeString;
         
         CGRect rect = self.timeLabel.frame;
         rect.origin.y = y;
         self.timeLabel.frame = rect;
     }
     
     + (CGFloat)heightWithModel:(TweetModel *)model
     {
         CGFloat height = 40;
         // 描述文字的高度
         NSDictionary *dict = @{NSFontAttributeName:[UIFont systemFontOfSize:16]};
         CGFloat descH = [model.body boundingRectWithSize:CGSizeMake(270, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size.height;
         
         height += (descH + 10);
         
         // 圖片
         if (model.imgSmall.length > 0) {
             height += 60 + 10;
         }
         
         // 時間
         height += (20 + 10);
         
         return height;
     }
    
  4. tableView的代理方法中與之前項目的不同之處
     - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
     {
         TweetModel *model = self.dataArray[indexPath.row];
         
         CGFloat h = [TweetCell heightWithModel:model];
         
         return h;
     }
    
  5. 去除自動布局, 使cell能正常顯示

二. 多媒體

  1. 播放本地音頻
     #import "AudioViewController.h"
     #import "MyUtility.h"
     #import <AVFoundation/AVFoundation.h>
     
     @interface AudioViewController ()
     {
         // 音頻播放
         AVAudioPlayer *_player;
         // 滑塊
         UISlider *_slider;
         // 定時器
         NSTimer *_timer;
     }
     
     @end
     
     @implementation AudioViewController
     
     - (void)viewDidLoad {
         [super viewDidLoad];
         // Do any additional setup after loading the view.
         
         // 播放按鈕
         UIButton *playBtn = [MyUtility creatBtnFrame:CGRectMake(100, 100, 80, 40) title:@"播放" target:self action:@selector(playAction:)];
     
         // 暫停按鈕
         UIButton *pauseBtn = [MyUtility creatBtnFrame:CGRectMake(100, 200, 80, 40) title:@"暫停" target:self action:@selector(pauseAction:)];
     
         // 停止按鈕
         UIButton *stopBtn = [MyUtility creatBtnFrame:CGRectMake(100, 300, 80, 40) title:@"停止" target:self action:@selector(stopAction:)];
     
         [self.view addSubview:playBtn];
         [self.view addSubview:pauseBtn];
         [self.view addSubview:stopBtn];
         
         // 初始化定時器
         _timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(timeAction:) userInfo:nil repeats:YES];
                   
         // 創(chuàng)建滑塊對象
         _slider = [[UISlider alloc] initWithFrame:CGRectMake(50, 400, 300, 20)];
         [self.view addSubview:_slider];
         // 添加事件
         [_slider addTarget:self action:@selector(slideAction:) forControlEvents:UIControlEventValueChanged];
     
     }
     
     - (void)timeAction:(id)sender
     {
         if (_player) {
             _slider.value = _player.currentTime;
         }
     }
     
     - (void)dealloc
     {
         if (_timer) {
             [_timer invalidate];
         }
     }
     
     - (void)slideAction:(id)sender
     {
         // 滑動時, 讓音頻播放到對應的位置
         if (_player) {
             _player.currentTime = _slider.value;
         }
     }
     
     - (void)playAction:(id)sender
     {
         // 播放本地音頻
         NSString *path = [[NSBundle mainBundle] pathForResource:@"song" ofType:@"mp3"];
         NSURL *url = [NSURL fileURLWithPath:path];
         _player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
         // 設(shè)置滑塊的最大值
         _slider.maximumValue = _player.duration;
         
         // 播放
         [_player prepareToPlay];
         [_player play];
     }
     
     - (void)pauseAction:(id)sender
     {
         [_player pause];
     }
     
     - (void)stopAction:(id)sender
     {
         [_player stop];
         _player.currentTime = 0;
     }
    
  2. 播放視頻
     #import "VideoViewController.h"
     #import "MyUtility.h"
     #import <MediaPlayer/MediaPlayer.h>
     @interface VideoViewController ()
     
     @property (nonatomic, strong) MPMoviePlayerViewController *moviePlayer;
     
     @end
     
     @implementation VideoViewController
     
     - (void)viewDidLoad {
         [super viewDidLoad];
         // Do any additional setup after loading the view.
         
         // 播放本地視頻按鈕
         UIButton *localBtn = [MyUtility creatBtnFrame:CGRectMake(100, 100, 80, 40) title:@"本地視頻" target:self action:@selector(playLocal:)];
         
         // 播放網(wǎng)絡視頻按鈕
         UIButton *netBtn = [MyUtility creatBtnFrame:CGRectMake(100, 200, 80, 40) title:@"網(wǎng)絡視頻" target:self action:@selector(playNet:)];
         
         [self.view addSubview:localBtn];
         [self.view addSubview:netBtn];
         self.view.backgroundColor = [UIColor whiteColor];
     }
     
     - (void)playLocal:(id)sender
     {
         // 本地路徑
         NSString *path = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"mp4"];
         NSURL *fileUrl = [NSURL fileURLWithPath:path];
         // 初始化播放對象
         _moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:fileUrl];
         // 播放
         [_moviePlayer.moviePlayer prepareToPlay];
         [_moviePlayer.moviePlayer play];
         
         // 顯示
         [self presentViewController:_moviePlayer animated:YES completion:nil];
     }
     
     - (void)playNet:(id)sender
     {
         // http://121.40.54.251:280/zhangchu/video/mp4/liangbanniuxinA.mp4
         NSURL *url = [NSURL URLWithString:@"http://121.40.54.251:280/zhangchu/video/mp4/liangbanniuxinA.mp4"];
         
         if (_moviePlayer) {
             [_moviePlayer.moviePlayer stop];
             _moviePlayer = nil;
         }
         
         _moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
         
         // 播放
         [_moviePlayer.moviePlayer prepareToPlay];
         [_moviePlayer.moviePlayer play];
         
         // 顯示
         [self presentViewController:_moviePlayer animated:YES completion:nil];
     }
    
  3. 錄音
     #import "RecordViewController.h"
     #import "MyUtility.h"
     #import <AVFoundation/AVFoundation.h>
     
     @interface RecordViewController ()
     
     // 錄音
     @property (nonatomic, strong) AVAudioRecorder *recoder;
     @property (nonatomic, strong) AVAudioPlayer *player;
     
     @end
     
     @implementation RecordViewController
     
     - (void)viewDidLoad {
         [super viewDidLoad];
         // Do any additional setup after loading the view.
         
         // 錄音按鈕
         UIButton *recordBtn = [MyUtility creatBtnFrame:CGRectMake(100, 100, 80, 40) title:@"錄音" target:self action:@selector(recordAction:)];
         
         // 停止錄音按鈕
         UIButton *stopBtn = [MyUtility creatBtnFrame:CGRectMake(100, 200, 80, 40) title:@"停止" target:self action:@selector(stopAction:)];
         
         // 播放按鈕
         UIButton *playBtn = [MyUtility creatBtnFrame:CGRectMake(100, 300, 80, 40) title:@"播放" target:self action:@selector(playAction:)];
     
         [self.view addSubview:recordBtn];
         [self.view addSubview:stopBtn];
         [self.view addSubview:playBtn];
         
         self.view.backgroundColor = [UIColor whiteColor];
     }
     
     // 獲取錄制音頻文件的路徑
     - (NSString *)creatPath
     {
         NSString *path = [NSHomeDirectory() stringByAppendingString:@"Document/test.wav"];
         NSLog(@"%@", path);
         return path;
     }
     
     - (void)recordAction:(id)sender
     {
         // 錄音
         // 1. 路徑
         // 2. 屬性
         NSMutableDictionary *dict = [NSMutableDictionary dictionary];
         //  1) 格式
         [dict setObject:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
         //  2) 采樣率
         [dict setObject:[NSNumber numberWithInt:1000] forKey:AVSampleRateKey];
         //  3) 聲道
         [dict setObject:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
         //  4) 采樣位數(shù)
         [dict setObject:[NSNumber numberWithInt:32] forKey:AVLinearPCMBitDepthKey];
         //  5) 是否采用高位優(yōu)先的采樣方式
         [dict setObject:[NSNumber numberWithBool:YES] forKey:AVLinearPCMIsBigEndianKey];
         //  6) 是否采用浮點數(shù)
         [dict setObject:[NSNumber numberWithBool:YES] forKey:AVLinearPCMIsFloatKey];
     
         /*
          第一個參數(shù): 錄制文件存儲的位置
          第二個參數(shù): 錄制的屬性
          第三個參數(shù): 錯誤信息
          */
         _recoder = [[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:[self creatPath]] settings:dict error:nil];
         
         // 錄制
         [_recoder prepareToRecord];
         [_recoder record];
         
     #warning 真機
         AVAudioSession *session = [AVAudioSession sharedInstance];
         [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
         [session setActive:YES error:nil];
     }
     
     - (void)stopAction:(id)sender
     {
         [_recoder stop];
     }
     
     - (void)playAction:(id)sender
     {
         _player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[self creatPath]] error:nil];
         
         [_player prepareToPlay];
         [_player play];
     }
    
  4. 從相冊選擇圖片
     #import "AlbumViewController.h"
     #import "MyUtility.h"
     
     @interface AlbumViewController () <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
     
     @end
     
     @implementation AlbumViewController
     
     - (void)viewDidLoad {
         [super viewDidLoad];
         // Do any additional setup after loading the view.
         
         // 按鈕, 點擊彈出相冊選擇界面
         UIButton *btn = [MyUtility creatBtnFrame:CGRectMake(100, 100, 80, 40) title:@"相冊" target:self action:@selector(showAlbum:)];
         [self.view addSubview:btn];
         
         self.view.backgroundColor = [UIColor whiteColor];
         
         // 圖片視圖
         UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(80, 200, 200, 100)];
         imgView.tag = 200;
         [self.view addSubview:imgView];
     }
     
     - (void)showAlbum:(id)sender
     {
         // 顯示相冊
         UIImagePickerController *ctrl = [[UIImagePickerController alloc] init];
         // 設(shè)置類型
         ctrl.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
         // 設(shè)置代理
         ctrl.delegate = self;
         // 顯示相冊
         [self presentViewController:ctrl animated:YES completion:nil];
         
     }
     
     #pragma mark - UIImagePickerController代理
     // 點擊取消按鈕調(diào)用
     - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
     {
         [picker dismissViewControllerAnimated:YES completion:nil];
     }
     
     // 選中一張圖片的時候調(diào)用
     - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
     {
         // 獲取圖片對象
         UIImage *image = info[UIImagePickerControllerOriginalImage];
         
         // 顯示出來
         UIImageView *myImageView = (UIImageView *)[self.view viewWithTag:200];
         myImageView.image = image;
         
         [picker dismissViewControllerAnimated:YES completion:nil];
     }
    
  5. 拍照
     #import "TakePhotoViewController.h"
     #import "MyUtility.h"
     
     @interface TakePhotoViewController () <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
     
     @end
     
     @implementation TakePhotoViewController
     
     - (void)viewDidLoad {
         [super viewDidLoad];
         // Do any additional setup after loading the view.
         
         // 按鈕, 點擊彈出相冊選擇界面
         UIButton *btn = [MyUtility creatBtnFrame:CGRectMake(100, 100, 80, 40) title:@"拍照" target:self action:@selector(takePhoto:)];
         [self.view addSubview:btn];
         
         self.view.backgroundColor = [UIColor whiteColor];
         
     }
     
     // 拍照
     - (void)takePhoto:(id)sender
     {
         UIImagePickerController *ctrl = [[UIImagePickerController alloc] init];
         // 設(shè)置代理
         ctrl.delegate = self;
         // 設(shè)置類型
         ctrl.sourceType = UIImagePickerControllerSourceTypeCamera;
         // 設(shè)置為拍照(跟錄視頻區(qū)分)
         ctrl.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
         
         // 顯示出來
         [self presentViewController:ctrl animated:YES completion:nil];
     }
     
     #pragma mark - UIImagePickerController代理方法
     - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
     {
         [picker dismissViewControllerAnimated:YES completion:nil];
     }
     
     - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
     {
         UIImage *image = info[UIImagePickerControllerOriginalImage];
         
         // 存儲到相冊
         UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
         
         [picker dismissViewControllerAnimated:YES completion:nil];
     
     }
    
  6. 錄視頻
     #import "VideoRecordViewController.h"
     #import "MyUtility.h"
     #import <AssetsLibrary/AssetsLibrary.h>
     
     @interface VideoRecordViewController () <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
     
     @end
     
     @implementation VideoRecordViewController
     
     - (void)viewDidLoad {
         [super viewDidLoad];
         // Do any additional setup after loading the view.
         
         // 按鈕, 點擊彈出相冊選擇界面
         UIButton *btn = [MyUtility creatBtnFrame:CGRectMake(100, 100, 80, 40) title:@"??" target:self action:@selector(videoRecord:)];
         [self.view addSubview:btn];
         
         self.view.backgroundColor = [UIColor whiteColor];
         
     }
     
     // 錄制視頻
     - (void)videoRecord:(id)sender
     {
         UIImagePickerController *ctrl = [[UIImagePickerController alloc] init];
         
         // 代理
         ctrl.delegate = self;
         // 類型
         ctrl.sourceType = UIImagePickerControllerSourceTypeCamera;
         // 媒體類型
         ctrl.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
         // 設(shè)置為錄視頻
         ctrl.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;
         
         // 顯示
         [self presentViewController:ctrl animated:YES completion:nil];
     }
     
     #pragma mark - UIImagePickerController代理方法
     -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
     {
         [picker dismissViewControllerAnimated:YES completion:nil];
     }
     
     - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
     {
         // 獲取視頻的地址
         NSURL *url = info[UIImagePickerControllerMediaURL];
         
         // 存到相冊里
         ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
         
         [library writeVideoAtPathToSavedPhotosAlbum:url completionBlock:^(NSURL *assetURL, NSError *error) {
             NSLog(@"%@", error);
         }];
         
         [picker dismissViewControllerAnimated:YES completion:nil];
     }
     
     - (void)didReceiveMemoryWarning {
         [super didReceiveMemoryWarning];
         // Dispose of any resources that can be recreated.
     }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拧抖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宛瞄,更是在濱河造成了極大的恐慌寞忿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件际邻,死亡現(xiàn)場離奇詭異芯丧,居然都是意外死亡,警方通過查閱死者的電腦和手機世曾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門缨恒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人轮听,你說我怎么就攤上這事肿轨。” “怎么了蕊程?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵椒袍,是天一觀的道長。 經(jīng)常有香客問我藻茂,道長驹暑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任辨赐,我火速辦了婚禮优俘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掀序。我一直安慰自己帆焕,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布不恭。 她就那樣靜靜地躺著叶雹,像睡著了一般财饥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上折晦,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天钥星,我揣著相機與錄音,去河邊找鬼满着。 笑死谦炒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的风喇。 我是一名探鬼主播宁改,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼魂莫!你這毒婦竟也來了透且?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤豁鲤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鲸沮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琳骡,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年讼溺,在試婚紗的時候發(fā)現(xiàn)自己被綠了楣号。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡怒坯,死狀恐怖炫狱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剔猿,我是刑警寧澤视译,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站归敬,受9級特大地震影響酷含,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汪茧,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一椅亚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舱污,春花似錦呀舔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霜瘪。三九已至,卻和暖如春省古,著一層夾襖步出監(jiān)牢的瞬間粥庄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工豺妓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惜互,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓琳拭,卻偏偏與公主長得像训堆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子白嘁,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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