iOS自定義轉(zhuǎn)場動畫

(http://blog.devtang.com/2016/03/13/iOS-transition-guide/)之前寫過一篇core Animation的文章里面提到,核心動畫里面有一個很重要的部分就是轉(zhuǎn)場動畫,而轉(zhuǎn)場動畫有包括三個部分:
1.模態(tài)方式的轉(zhuǎn)場
2.導(dǎo)航欄式的轉(zhuǎn)場(push pop)
3.手勢驅(qū)動轉(zhuǎn)場
4.tabber轉(zhuǎn)場動畫
一. 模態(tài)方式的轉(zhuǎn)場

7月-13-2016 17-23-44.gif
 默認(rèn)的模態(tài)專場方式是:頁面從底部彈出來.那么要實現(xiàn)其他的方式應(yīng)該怎么做呢

首先要重寫專長的代理方法
創(chuàng)建一個類 繼承與nsobject 并且準(zhǔn)守代理方法UIViewControllerAnimatedTransitioning

//.h文件的內(nèi)容
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface Transtion : NSObject<UIViewControllerAnimatedTransitioning>
@property (assign, nonatomic) BOOL reverse;//用來標(biāo)記是跳轉(zhuǎn)還是返回
- (instancetype)init;//初始話方法
@end
//.m文件中的部分代碼
#import "Transtion.h"
@interface Transtion()
@property (assign, nonatomic) id context;
@property (strong, nonatomic) UIView* containerView;
@end
@implementation Transtion
-(instancetype)init{
    if (self = [super init]) {
        
    }
    return self;
}
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{
    return 5;//過渡時間代理方法
}
//.m文件中重要的重寫代理方法
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
    _context = transitionContext;
    self.containerView = [transitionContext containerView];
   
    if (!self.reverse) {
         NSLog(@"跳轉(zhuǎn)");
     UIViewController* toVC = [_context viewControllerForKey:UITransitionContextToViewControllerKey];//獲取將要得到的第二個界面

    CGSize screenSize = [UIScreen mainScreen].bounds.size;
    toVC.view.frame = CGRectMake(0, 0, screenSize.width, screenSize.height);//secondVC 給頁面賦值
     
      
    [UIView animateWithDuration:2 animations:^{

        [self.containerView.layer setTransform:[self firstTransform:M_PI/2.0]];
//self.containerView 是轉(zhuǎn)場的過渡視圖容器, 將他旋轉(zhuǎn)90度
    } completion:^(BOOL finished) {
              [self.containerView addSubview:toVC.view];//旋轉(zhuǎn)90度以后 將即將出現(xiàn)個的控制器的view添加
        
        [UIView animateWithDuration:3 animations:^{
            [self.containerView.layer setTransform:[self firstTransform:M_PI*0]];//繼續(xù)旋轉(zhuǎn)(歸位也可以)
        } completion:^(BOOL finished) {
                          [_context completeTransition:YES];
//結(jié)束轉(zhuǎn)場時間
        }];
           }];
    }else{
     NSLog(@"返回");//如果是返回的話就走這個界面  這應(yīng)該就不用解釋啦把
        UIViewController* toVC = [_context viewControllerForKey:UITransitionContextToViewControllerKey];

        CGSize screenSize = [UIScreen mainScreen].bounds.size;
        toVC.view.frame = CGRectMake(0, 0, screenSize.width, screenSize.height);

        [UIView animateWithDuration:2 animations:^{
 
            [self.containerView.layer setTransform:[self firstTransform:M_PI*1.5]];

        } completion:^(BOOL finished) {
               [self.containerView addSubview:toVC.view];
            
            [UIView animateWithDuration:3 animations:^{

                [self.containerView.layer setTransform:[self firstTransform:M_PI*0]];

            }completion:^(BOOL finished) {
                
                 [_context completeTransition:YES];
            }];
            
        }];

    }
}

控制器中的使用

首先遵守該協(xié)議<UIViewControllerTransitioningDelegate>
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    secondViewController * second = [[secondViewController alloc]init];
    second.transitioningDelegate =self;//建立代理鏈接
   
    [self presentViewController:second animated:YES completion:nil];
  //  [self.navigationController pushViewController:second animated:YES];
     
}

- (Transtion*)trastion{
    if (!_trastion) {
        _trastion = [[Transtion alloc]init];
    }
    return _trastion;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    self.trastion.reverse = YES;//返回
    return self.trastion;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    self.trastion.reverse = NO;//跳轉(zhuǎn)
    return self.trastion;
}

好了 模態(tài)的就搞定啦

二,導(dǎo)航欄(push pop)
這個很見到其實和模態(tài)差不多

7月-14-2016 09-24-49.gif

Transtion.h 文件里面的東西不用該

我們要修改的是控制器里面的

準(zhǔn)守協(xié)議
@interface ViewController ()<UIViewControllerTransitioningDelegate,UINavigationControllerDelegate>
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.delegate =self;//建立代理連接很重要哦
    self.view.backgroundColor = [UIColor greenColor];
    self.navigationItem.title = @"第一頁";
    // Do any additional setup after loading the view, typically from a nib.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    secondViewController * second = [[secondViewController alloc]init];
    second.transitioningDelegate =self;
   
    //[self presentViewController:second animated:YES completion:nil];
    [self.navigationController pushViewController:second animated:YES];
     
}
- (Transtion*)trastion{
    if (!_trastion) {
        _trastion = [[Transtion alloc]init];
    }
    return _trastion;
}
//push 用到的代理方法啊
-(id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC{
    NSLog(@"push代理");
    if (operation == UINavigationControllerOperationPush) {
        self.trastion.reverse = NO;
        return self.trastion;

    }else{
        self.trastion.reverse = YES;
        return self.trastion;

    }
}
ok push 搞定

補充: 我們有時后或做一些復(fù)雜的轉(zhuǎn)場動畫這時候會用到連個常用的工具函數(shù)

//.m文件的全部內(nèi)容
- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates NS_AVAILABLE_IOS(7_0);//對某個view進(jìn)行截圖 
- (UIView *)resizableSnapshotViewFromRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates withCapInsets:(UIEdgeInsets)capInsets NS_AVAILABLE_IOS(7_0);  //對某個view的某個部位進(jìn)行截圖

場景模擬:我們可以在點擊轉(zhuǎn)場以后 對第一個頁面的某一個部分截圖 然后添加到過渡視圖容器上讓著個截圖在轉(zhuǎn)場的整個過程中都可以看到
三. 手勢驅(qū)動
等待更新吧 因為建鍋還沒來得及搞~~~~~~~~~ 等我后續(xù)
接下來我們來搞手勢驅(qū)動(手勢驅(qū)動個人遇到了一些問題可困惑一會可以分享)
首先手勢驅(qū)動需要重寫另一個代理方法:創(chuàng)建類繼承與UIPercentDrivenInteractiveTransition

//.h文件
#import <UIKit/UIKit.h>

@interface MyPercentDrivenInteractiveTransition : UIPercentDrivenInteractiveTransition
@property (nonatomic, assign) BOOL interactionInProgress;
- (void)writeFromoViewController:(UIViewController*)fromVC AndToViewController:(UIViewController*)toVC;//一個添加手勢的方法
@end

接下來就是識別手勢并且更具滑動的時百分比驅(qū)動頁面的轉(zhuǎn)動

#import "MyPercentDrivenInteractiveTransition.h"
@interface MyPercentDrivenInteractiveTransition(){
 BOOL  _shouldCompleteTransition;
}
@property(nonatomic,strong)UIViewController * FromVC;
@property(nonatomic,strong)UIViewController * ToVC;
@end
@implementation MyPercentDrivenInteractiveTransition
static  float fraction = 0;
- (void)writeFromoViewController:(UIViewController*)fromVC AndToViewController:(UIViewController*)toVC{
    self.FromVC = fromVC;
    self.ToVC = toVC;
    [self addGestureRecognizerInFromView:toVC.view];
}

- (void)addGestureRecognizerInFromView:(UIView*)fromView{
    UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(geatureRecognizer:)];
    [fromView addGestureRecognizer:pan];
}
-(CGFloat)completionSpeed
{
    return 1-self.percentComplete ;
}

- (void)geatureRecognizer:(UIPanGestureRecognizer*)GestureRecognizer{
    CGPoint translation = [GestureRecognizer translationInView:GestureRecognizer.view.superview];
    NSLog(@"==== %f",translation.x);
    switch (GestureRecognizer.state) {
        case UIGestureRecognizerStateBegan:
            self.interactionInProgress = YES;

            [self.ToVC.navigationController popViewControllerAnimated:YES];
            break;
        case UIGestureRecognizerStateChanged:{
            fraction =  -(translation.x / 200);//200是我自己給的 可以給平款用來計算百分比
            fraction = fmin(fmaxf(fraction, 0.0), 1.0);
            NSLog(@"fraction === %f",translation.x);
            _shouldCompleteTransition = fraction > 0.5;
            //    _shouldCompleteTransition = 1;
            [self updateInteractiveTransition:fraction];
        }
            break;
     case UIGestureRecognizerStateEnded:
        case UIGestureRecognizerStateCancelled:
        {
            /**
             *  需要判斷是結(jié)束了還是取消了
             */
            
            self.interactionInProgress = NO;
            
            if (!_shouldCompleteTransition || GestureRecognizer.state == UIGestureRecognizerStateCancelled)
            {
                //只要有一個不成立 那么就是取消了
                
                [self cancelInteractiveTransition];//取消
            }
            
            else
            {
                [self finishInteractiveTransition];//結(jié)束
            }
        }

        default:
            break;
    }
}
@end

控制器里面要初始化這個類

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC{
    if (operation == UINavigationControllerOperationPush) {
        self.trastionAnimstion.pushOrPop = YES;
        
        [_myPercentDrivenInteractiveTransition writeFromoViewController:fromVC AndToViewController:toVC];//push時用的不是手勢是按鈕 這時候給toview 添加手勢
        return self.trastionAnimstion;
    }else{
        self.trastionAnimstion.pushOrPop = NO;
        return self.trastionAnimstion;
    }
}

//這是交互的代理實現(xiàn)
-(id<UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController
{
  
    return _myPercentDrivenInteractiveTransition.interactionInProgress ? _myPercentDrivenInteractiveTransition : nil;
   
}

到離這里按說改完美結(jié)束了 但是結(jié)果總是出人意外:在實現(xiàn)動畫是
我第一次用了前面的實現(xiàn)方式

CGSize screenSize = [UIScreen mainScreen].bounds.size;
    _toVC.view.frame = CGRectMake(0, 0, screenSize.width, screenSize.height);
    [self.ContainerView addSubview:self.toVC.view];
    self.toVC.view.alpha = 0;
    [UIView animateWithDuration:TrasitonTime/2.0 animations:^{
        [self.ContainerView.layer setTransform:[self trasfrom:M_PI_2 * directFlage]];
    } completion:^(BOOL finished) {
        self.toVC.view.alpha = 1;
        [UIView animateWithDuration:TrasitonTime/2.0 animations:^{
            [self.ContainerView.layer setTransform:[self trasfrom:0]];
        } completion:^(BOOL finished) {
            [TransitionContext completeTransition:![TransitionContext transitionWasCancelled]];
        }];
        
    }];
//沒看錯這就是我前面實現(xiàn)

沒看錯這就是我前面實現(xiàn)旋轉(zhuǎn)時 用的方法 但是手勢驅(qū)動時不好用
在執(zhí)行下面這一段時 translation.x 打印出來為 NAN(意思就是不是一個數(shù)字),這里我搞了好久然后看了一些成功案例 進(jìn)行了模仿

case UIGestureRecognizerStateChanged:{
            fraction =  -(translation.x / 200);
            fraction = fmin(fmaxf(fraction, 0.0), 1.0);
            NSLog(@"fraction === %f",translation.x);
            _shouldCompleteTransition = fraction > 0.5;
            //    _shouldCompleteTransition = 1;
            [self updateInteractiveTransition:fraction];
        }
            break;

采用了第二種方法(但是依然有問題)

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
self.fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
   self.toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    self.ContainerView = [transitionContext containerView];
    TrasitonTime = [self transitionDuration:transitionContext];
    TransitionContext = transitionContext;
    self.fromVC.view.frame = [UIScreen mainScreen].bounds;
    self.toVC.view.frame = [UIScreen mainScreen].bounds;
    [self.ContainerView addSubview:self.toVC.view];
    if (self.pushOrPop == YES) {
        [self pushOrPresent];
    }else{
        [self popOrDismiss];
    }

}
- (void)pushOrPresent{
  //  [_ContainerView addSubview:_toVC.view];
 //   _toVC.view.alpha = 0;
    [self animationTrasFromDirect:-1.0];
    }

- (void)popOrDismiss{
    
    [self animationTrasFromDirect:1.0];

}
- (void)animationTrasFromDirect:(CGFloat)directFlage{
    //這一段如果把時間改長也會出現(xiàn)一系列問題
    [self.toVC.view.layer setTransform:[self trasfrom: - M_PI_2 * directFlage ]];
  // _toVC.view.layer.transform = [self yRotation:directFlage  *  -M_PI_2];
    [UIView animateKeyframesWithDuration:TrasitonTime delay:0 options:0 animations:^{
        [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:TrasitonTime/2.0 animations:^{
            [self.fromVC.view.layer setTransform:[self trasfrom:M_PI_2 * directFlage]];
        }];
        [UIView addKeyframeWithRelativeStartTime:TrasitonTime/2.0 relativeDuration:TrasitonTime/2.0  animations:^{
         
            [self.toVC.view.layer setTransform:CATransform3DIdentity];
        }];
    } completion:^(BOOL finished) {
        [TransitionContext completeTransition:![TransitionContext transitionWasCancelled]];
    }];
}

這個方法呢解決了手勢驅(qū)動問題 但是又有新麻煩:當(dāng)設(shè)置轉(zhuǎn)場時間1.0s是沒問題效果如下:

7月-18-2016 15-50-34.gif

但是如果改成3.0s 就有問題啦(當(dāng)頁面旋轉(zhuǎn)到一半時,切換第二個頁面時,沒有了過渡的動畫效果) 效果如圖:

7月-18-2016 15-53-55.gif

當(dāng)然在最后也找了一個完全沒問題的而寫法(這個寫法是我借鑒網(wǎng)文寫的但是我感覺和我的第二種方法差不多 但是效果就是沒問題)

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
// zhe一段是完全沒問題的
    UIView * containerView = [transitionContext containerView];
    

    UIViewController * fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    
    UIViewController * toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    
    UIView * fromView = fromViewController.view;
    
    UIView * toView = toViewController.view;
    
    [containerView addSubview:toView];
    
    
//    CATransform3D transform = CATransform3DIdentity;
//    
//    transform.m34 = -0.0001;
//    
//     [containerView.layer setSublayerTransform:transform];
    
    
//    CGRect  initialFrame = [transitionContext initialFrameForViewController:fromViewController];
//    
//    
//    //設(shè)置視圖大小
//    toView.frame = initialFrame;
//    fromView.frame = initialFrame;
    
    //是否是反面
    float factor = self.pushOrPop ? -1.0 : 1.0;
    
    //push操作 y軸方向順時針旋轉(zhuǎn)90度 這樣第一時間是看不到toView的
    toView.layer.transform = [self yRotation:factor  *  -M_PI_2];
    
    //animate
    
    NSTimeInterval duration = [self transitionDuration:transitionContext];
    
    [UIView animateKeyframesWithDuration:duration delay:0 options:0 animations:^{
        
        
        [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.5 animations:^{
            
            //fromView-----
            
           // fromView.layer.transform = [self yRotation:factor * M_PI_2];
           [fromView.layer setTransform:[self trasfrom: factor * M_PI_2]];
        }];
        
        [UIView addKeyframeWithRelativeStartTime:0.5 relativeDuration:0.5 animations:^{
            
             [toView.layer setTransform: [self trasfrom: 0]];
            //toVIew復(fù)原 在先前順時針的基礎(chǔ)上 逆時針旋轉(zhuǎn)90度 復(fù)原
            //toView.layer.transform = [self yRotation:0.0];
            
        }];
        
        
    } completion:^(BOOL finished) {
        
        
        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
        
    }];
    

效果我就不上了但是保證效果嘎嘎好

在這我想知道 各位道友知道 問題出在哪里 (我實在是找不到了這一篇斷斷續(xù)續(xù)寫了好幾天)代碼地址:https://git.oschina.net/GAOZEJIAN/transitionAnimation.git

四 , tabber轉(zhuǎn)場動畫
好吧到這里我不想寫啦 我感覺用上面的思路就可以解決 如果還是不會自行百度學(xué)習(xí)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市痢虹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酗洒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡冰悠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門配乱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溉卓,“玉大人,你說我怎么就攤上這事搬泥∩U” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵忿檩,是天一觀的道長尉尾。 經(jīng)常有香客問我,道長燥透,這世上最難降的妖魔是什么沙咏? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮班套,結(jié)果婚禮上肢藐,老公的妹妹穿的比我還像新娘。我一直安慰自己吱韭,他們只是感情好吆豹,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著理盆,像睡著了一般痘煤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猿规,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天衷快,我揣著相機與錄音,去河邊找鬼坎拐。 笑死烦磁,一個胖子當(dāng)著我的面吹牛养匈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播都伪,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呕乎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了陨晶?” 一聲冷哼從身側(cè)響起猬仁,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎先誉,沒想到半個月后湿刽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡褐耳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年诈闺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铃芦。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡雅镊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刃滓,到底是詐尸還是另有隱情仁烹,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布咧虎,位于F島的核電站卓缰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏砰诵。R本人自食惡果不足惜征唬,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茁彭。 院中可真熱鬧鳍鸵,春花似錦、人聲如沸尉间。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哲嘲。三九已至,卻和暖如春媳禁,著一層夾襖步出監(jiān)牢的瞬間眠副,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工竣稽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留囱怕,地道東北人霍弹。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像娃弓,于是被迫代替她去往敵國和親典格。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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

  • 更新,更簡單的自定義轉(zhuǎn)場集成台丛! 幾句代碼快速集成自定義轉(zhuǎn)場效果+ 全手勢驅(qū)動 寫在前面 這兩天閑下來好好的研究了一...
    wazrx閱讀 73,860評論 84 584
  • 通過這幾天的學(xué)習(xí)耍缴,我嘗試實現(xiàn)了四個效果,廢話不多說挽霉,先上效果圖: DEMO ONE:一個神奇移動效果push動畫防嗡,...
    petry閱讀 1,717評論 0 5
  • iOS7.0后蘋果提供了自定義轉(zhuǎn)場動畫的API,利用這些API我們可以改變 push和pop(navigation...
    薛定喵的鵝閱讀 17,749評論 1 37
  • 時光的繁花中 盛開與凋零間 我們妄想修煉著什么?我們又剩下什么实胸?——《修煉愛情》林俊杰! 暑假就這么靜悄悄的開始了...
    茉莉雨1314閱讀 492評論 0 2
  • “你可愿意跟我走他嫡?” 不清不楚的問話,卻偏偏這樣理所當(dāng)然童芹,叫人不得違抗涮瞻,仿佛眼前這男子,生來便該有這樣的氣勢假褪,這樣...
    千古而序閱讀 234評論 0 0