亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

淺談iOS11新特性:新增拖拽交互體驗

2019-10-21 18:43:08
字體:
來源:轉載
供稿:網友

一、引言

在使用PC進行操作時,你一定遇到過這樣的場景,可以將圖片直接拖入聊天軟件進行發送,可以將文檔、音樂、視頻文件等文件拖入相應應用程序直接進行使用。這種拖拽操作交互極大的方便了電腦的使用。在iOS11中,你可以在iPhone或iPad上構建這種交互體驗!

說在前面的話:

拖拽操作在iPad上是支持跨應用程序的,你可以從一個應用中拖取項目,通過Home鍵回到主界面并且打開另一個應用程序,然后將被拖拽的項目傳遞給這個應用程序中。在iPhone上,拖拽操作只支持當前應用程序內,你可以將某個元素從一個界面拖拽到另一個,這種維度的操作可以給設計人員更大的靈活性。

拖拽操作被設計成系統管理,開發者不需要為App申請特殊的用戶權限。   

二、拖拽源

對于拖拽操作,至少要有兩個組件,一個組件作為拖拽源用來提供數據,一個組件作為拖拽目的用來接收數據,當前,同一個組件既可以是拖拽源也可以是拖拽目的。首先我們先來看拖拽源,在UIKit框架中,iOS11默認實現了一些組件可以作為拖拽源, 例如UITextField、UITextView、UITableView和UICollectionView等。文本組件默認支持拖拽操作進行文本的傳遞,對于列表組件則默認支持元素的拖拽。例如,在UITextField選中的文案中進行拖拽,可以將文字拖拽出來,效果如下圖:

iOS11,拖拽交互,拖拽的交互

任意的UIView組件都可以作為拖拽源,讓其成為拖拽源其實也十分簡單,只需要3步:

1.創建一個UIDragInteraction行為對象。

2.設置UIDragInteraction對象的代理并實現相應方法。

3.將UIDragInteraction對象添加到指定View上。

最簡單的可拖拽組件的創建示例代碼如下:

- (void)viewDidLoad {  [super viewDidLoad];  [self.view addSubview:self.dragView];}//創建View-(UIView *)dragView{  if (!_dragView) {    _dragView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];    _dragView.backgroundColor = [UIColor redColor];    [_dragView addInteraction:self.dragInteraction];  }  return _dragView;}//創建拖拽行為對象-(UIDragInteraction *)dragInteraction{  if (!_dragInteraction) {    _dragInteraction = [[UIDragInteraction alloc]initWithDelegate:self];    //要設置可用 注意?。。?   [_dragInteraction setEnabled:YES];  }  return _dragInteraction;}//實現提供數據的代理方法- (NSArray<UIDragItem *> *)dragInteraction:(UIDragInteraction *)interaction itemsForBeginningSession:(id<UIDragSession>)session{  //數據提供者  NSItemProvider * provider = [[NSItemProvider alloc]initWithObject:@"Hello World"];  UIDragItem * item = [[UIDragItem alloc]initWithItemProvider:provider];  return @[item];}

上面的dragInteraction:代理方法用來提供要傳遞的數據,傳遞的數據必須遵守相應的承諾協議,后面會給大家介紹,這里只是簡單返回了一個字符串數據Hello World,運行工程,你可以試驗下,可以直接將我們自定義的視圖拖拽進UITextField并在其中顯示Hello World。

三、關于UIDragInteraction類

所有可以接收拖拽行為的組件都必須通過這個類實現,這個類中屬性意義列舉如下:

//初始化方法- (instancetype)initWithDelegate:(id<UIDragInteractionDelegate>)delegate;//代理@property (nonatomic, nullable, readonly, weak) id<UIDragInteractionDelegate> delegate;//是否支持多種手勢都接收響應@property (nonatomic) BOOL allowsSimultaneousRecognitionDuringLift;//設置是否有效@property (nonatomic, getter=isEnabled) BOOL enabled;//獲取默認是否有效 不同的設備這個值將有所區別@property (class, nonatomic, readonly, getter=isEnabledByDefault) BOOL enabledByDefault;

四、UIDragInteractionDelegate協議

UIDragInteractionDelegate用來處理拖拽源的行為與數據。其中定義了一個必須實現的方法和許多可選實現的方法。解析如下:

/*這個方法是必須實現的用來返回拖拽源提供的數據需要注意,這個函數需要返回一個數組,數組中可以有多個數據源如果返回空數組,則拖拽行為不會開始*/- (NSArray<UIDragItem *> *)dragInteraction:(UIDragInteraction *)interaction itemsForBeginningSession:(id<UIDragSession>)session;/*這個方法用來自定義拖拽效果的預覽視圖 關于預覽視圖,后面會介紹需要注意,系統默認會提供一個預覽視圖,不實現這個方法即是使用系統默認的如果返回nil,則會去除預覽動畫*/- (nullable UITargetedDragPreview *)dragInteraction:(UIDragInteraction *)interaction previewForLiftingItem:(UIDragItem *)item session:(id<UIDragSession>)session;/*拖拽動畫即將開始時會調用此函數*/- (void)dragInteraction:(UIDragInteraction *)interaction willAnimateLiftWithAnimator:(id<UIDragAnimating>)animator session:(id<UIDragSession>)session;//拖拽行為會話即將開始時調用的方法- (void)dragInteraction:(UIDragInteraction *)interaction sessionWillBegin:(id<UIDragSession>)session;//這個方法設置數據的防止是否允許數據的 移動操作,需要注意,這個只有在app內有效,跨app的操作會總是復制數據- (BOOL)dragInteraction:(UIDragInteraction *)interaction sessionAllowsMoveOperation:(id<UIDragSession>)session;//設置是否允許跨應用程序進行拖拽 ipad- (BOOL)dragInteraction:(UIDragInteraction *)interaction sessionIsRestrictedToDraggingApplication:(id<UIDragSession>)session;//設置預覽視圖是否顯示原始大小- (BOOL)dragInteraction:(UIDragInteraction *)interaction prefersFullSizePreviewsForSession:(id<UIDragSession>)session;/*當拖拽源被移動時調用,可以用如下方法獲取其坐標NSLog(@"%f,%f",[session locationInView:self.view].x,[session locationInView:self.view].y);*/- (void)dragInteraction:(UIDragInteraction *)interaction sessionDidMove:(id<UIDragSession>)session;//拖拽行為將要結束時調用- (void)dragInteraction:(UIDragInteraction *)interaction session:(id<UIDragSession>)session willEndWithOperation:(UIDropOperation)operation;//拖拽行為已經結束時調用- (void)dragInteraction:(UIDragInteraction *)interaction session:(id<UIDragSession>)session didEndWithOperation:(UIDropOperation)operation;//拖拽源進行了放置操作后調用- (void)dragInteraction:(UIDragInteraction *)interaction sessionDidTransferItems:(id<UIDragSession>)session;//設置拖拽動作取消的視圖動畫 返回nil則消除動畫-(nullable UITargetedDragPreview *)dragInteraction:(UIDragInteraction *)interaction previewForCancellingItem:(UIDragItem *)item withDefault:(UITargetedDragPreview *)defaultPreview;//拖拽動作即將取消時調用的方法- (void)dragInteraction:(UIDragInteraction *)interaction item:(UIDragItem *)item willAnimateCancelWithAnimator:(id<UIDragAnimating>)animator;//設置是否允許向拖拽中的項目添加數據/*可以返回數據載體數組 當拖拽過程中 點擊可拖拽的組件時會觸發*/- (NSArray<UIDragItem *> *)dragInteraction:(UIDragInteraction *)interaction itemsForAddingToSession:(id<UIDragSession>)session withTouchAtPoint:(CGPoint)point;//設置允許進行拖拽中追加數據的拖拽行為會話- (nullable id<UIDragSession>)dragInteraction:(UIDragInteraction *)interaction sessionForAddingItems:(NSArray<id<UIDragSession>> *)sessions withTouchAtPoint:(CGPoint)point;//將要向拖拽組件中追加數據時調用- (void)dragInteraction:(UIDragInteraction *)interaction session:(id<UIDragSession>)session willAddItems:(NSArray<UIDragItem *> *)items forInteraction:(UIDragInteraction *)addingInteraction;

上面列舉的協議方法中有關聯到其他許多iOS11中新增的類,后面會一一介紹。其實,完成了以上內容的了解,你就已經可以完全隨心所欲的定制拖拽源組件了。

五、放置目的地

拖拽源是數據的提供者,放置目的地就是數據的接收者。前面我們也實驗過,將自定義的拖拽源拖拽進UITextField后,文本框中會自動填充我們提供的文本數據。同樣,對于任何自定義的UIView視圖,我們也可以讓其成為放置目的地,需要完成如下3步:

1.創建一個UIDropInteraction行為對象。

2.設置UIDropInteraction對象的代理并實現協議方法。

3.將其添加到自定義的視圖中。

例如,我們將自定義的UILabel組件用來顯示拖拽的文案:

//添加視圖- (void)viewDidLoad {  [super viewDidLoad];  //有關拖拽源的代碼 前面已經列舉過 這里不再重復  [self.view addSubview:self.dragView];  [self.view addSubview:self.dropLabel];}-(UILabel *)dropLabel{  if (!_dropLabel) {    _dropLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 300, 300, 30)];    _dropLabel.backgroundColor = [UIColor greenColor];    _dropLabel.userInteractionEnabled = YES;    [_dropLabel addInteraction:self.dropInteraction];  }  return _dropLabel;}//放置目的地行為對象-(UIDropInteraction*)dropInteraction{  if (!_dropInteraction) {    _dropInteraction = [[UIDropInteraction alloc]initWithDelegate:self];  }  return _dropInteraction;}//這個方法返回是否響應此放置目的地的放置請求-(BOOL)dropInteraction:(UIDropInteraction *)interaction canHandleSession:(id<UIDropSession>)session{  return YES;}//設置以何種方式響應拖放會話行為-(UIDropProposal *)dropInteraction:(UIDropInteraction *)interaction sessionDidUpdate:(id<UIDropSession>)session{  return [[UIDropProposal alloc]initWithDropOperation:UIDropOperationCopy];}//已經應用拖放行為后執行的操作-(void)dropInteraction:(UIDropInteraction *)interaction performDrop:(id<UIDropSession>)session{   [session loadObjectsOfClass:[NSString class] completion:^(NSArray<__kindof id<NSItemProviderReading>> * _Nonnull objects) {    self.dropLabel.text = objects.firstObject;  }];}

上面的代碼將我們自定義的拖拽源提供的Hello World拖放進了UILabel組件中。

六、關于UIDropInteraction類

與UIDragInteraction類類似,這個類的作用是讓組件有相應放置操作的能力。其中屬性如下:

//初始化方法- (instancetype)initWithDelegate:(id<UIDropInteractionDelegate>)delegate;//代理對象@property (nonatomic, nullable, readonly, weak) id<UIDropInteractionDelegate> delegate;//是否允許多個交互行為@property (nonatomic, assign) BOOL allowsSimultaneousDropSessions;

七、UIDropInteractionDelegate協議

UIDropInteractionDelegate協議中所定義的方法全部是可選實現的,其用來處理用戶放置交互行為。

//放置行為即將響應時觸發的方法 返回值確定是否響應此次行為- (BOOL)dropInteraction:(UIDropInteraction *)interaction canHandleSession:(id<UIDropSession>)session;//當上面的協議方法返回YES時會接著調用這個函數- (void)dropInteraction:(UIDropInteraction *)interaction sessionDidEnter:(id<UIDropSession>)session;//將要處理數據時回調的方法/*當數據源數據添加時,這個方法也會被重新調用 這個函數需要返回一個處理行為方式UIDropProposal對象,這個我們后面再說*/- (UIDropProposal *)dropInteraction:(UIDropInteraction *)interaction sessionDidUpdate:(id<UIDropSession>)session;//放置行為相應結束的時候會調用此方法- (void)dropInteraction:(UIDropInteraction *)interaction sessionDidExit:(id<UIDropSession>)session;//這個方法當用戶進行放置時會調用,可以從session中獲取被傳遞的數據- (void)dropInteraction:(UIDropInteraction *)interaction performDrop:(id<UIDropSession>)session;//放置動畫完成后會調用這個方法- (void)dropInteraction:(UIDropInteraction *)interaction concludeDrop:(id<UIDropSession>)session;//整個拖放行為結束后會調用- (void)dropInteraction:(UIDropInteraction *)interaction sessionDidEnd:(id<UIDropSession>)session;//下面這些方法用來自定義放置動畫//設置放置預覽動畫- (nullable UITargetedDragPreview *)dropInteraction:(UIDropInteraction *)interaction previewForDroppingItem:(UIDragItem *)item withDefault:(UITargetedDragPreview *)defaultPreview;//這個函數每當有一個拖拽數據項放入時都會調用一次 可以進行動畫- (void)dropInteraction:(UIDropInteraction *)interaction item:(UIDragItem *)item willAnimateDropWithAnimator:(id<UIDragAnimating>)animator;

需要注意,UIDropProposal類用來進行處理回執,屬性方法解析如下:

//初始化方法/*typedef NS_ENUM(NSUInteger, UIDropOperation) {  //取消這次行為  UIDropOperationCancel  = 0,  //拒絕行為  UIDropOperationForbidden = 1,  //接收拷貝數據  UIDropOperationCopy   = 2,  //接收移動數據  UIDropOperationMove   = 3,}*/- (instancetype)initWithDropOperation:(UIDropOperation)operation;//處理方式@property (nonatomic, readonly) UIDropOperation operation;//精準定位@property (nonatomic, getter=isPrecise) BOOL precise;//設置是否展示完整的預覽尺寸@property (nonatomic) BOOL prefersFullSizePreview;

八、拖拽數據載體UIDragItem類

UIDragItem類用來承載要傳遞的數據。其通過NSItemProvider類來進行構建,傳遞的數據類型是有嚴格規定的,必須遵守一定的協議,系統的NSString,NSAttributeString,NSURL,UIColor和UIImage是默認支持的,你可以直接傳遞這些數據。

UIDragItem中提供的屬性方法:

//初始化方法- (instancetype)initWithItemProvider:(NSItemProvider *)itemProvider;//數據提供者實例@property (nonatomic, readonly) __kindof NSItemProvider *itemProvider;//用來傳遞一些額外的關聯信息@property (nonatomic, strong, nullable) id localObject;//用來自定義每個item添加時的預覽動畫@property (nonatomic, copy, nullable) UIDragPreview * _Nullable (^previewProvider)(void);

九、UIDropSession與UIDragSession

在與拖拽交互相關的接口中,這兩個是面向協議編程的絕佳范例,首先在UIKit框架中只定義了這兩個協議,而并沒有相關的實現類,在拖拽行為的相關回調接口中,很多id類型的參數都遵守了這個協議,我們無需知道是哪個類實現的,直接進行使用即可:

UIDropSession:

//繼承于UIDragDropSession(提供基礎數據), NSProgressReporting(提供數據讀取進度)@protocol UIDropSession <UIDragDropSession, NSProgressReporting>//原始的dragSesstion會話 如果是跨應用的 則為nil@property (nonatomic, readonly, nullable) id<UIDragSession> localDragSession;//設置進度風格/*typedef NS_ENUM(NSUInteger, UIDropSessionProgressIndicatorStyle) {  UIDropSessionProgressIndicatorStyleNone,    // 無  UIDropSessionProgressIndicatorStyleDefault,  // 默認的} API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);*/@property (nonatomic) UIDropSessionProgressIndicatorStyle progressIndicatorStyle;//進行數據的加載- (NSProgress *)loadObjectsOfClass:(Class<NSItemProviderReading>)aClass completion:(void(^)(NSArray<__kindof id<NSItemProviderReading>> *objects))completion;@end

UIDragSession:

API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos) @protocol UIDragSession <UIDragDropSession>//設置要傳遞的額外信息 只有在同個APP內可見@property (nonatomic, strong, nullable) id localContext;@end

UIDragDropSession:

//傳遞的數據數組@property (nonatomic, readonly) NSArray<UIDragItem *> *items;//當前操作行為的坐標- (CGPoint)locationInView:(UIView *)view;//此次行為是否允許移動操作@property (nonatomic, readonly) BOOL allowsMoveOperation;//是否支持應用程序層面的拖拽@property (nonatomic, readonly, getter=isRestrictedToDraggingApplication) BOOL restrictedToDraggingApplication;//驗證傳遞的數據是否支持某個數據類型協議- (BOOL)hasItemsConformingToTypeIdentifiers:(NSArray<NSString *> *)typeIdentifiers;//驗證傳遞的數據是否可以加載某個類- (BOOL)canLoadObjectsOfClass:(Class<NSItemProviderReading>)aClass;

十、交互預覽類UITargetedDragPreview

UITargetedDragPreview專門用來處理拖放交互過程中的動畫與預覽視圖。方法解析如下:

//創建一個預覽對象 /*view:要創建的預覽視圖 需要注意,這個視圖必須在window上param:配置參數target:容器視圖,用來展示預覽,一般設置為view的父視圖*/- (instancetype)initWithView:(UIView *)view parameters:(UIDragPreviewParameters *)parameters target:(UIDragPreviewTarget *)target;//同上-(instancetype)initWithView:(UIView *)view parameters:(UIDragPreviewParameters *)parameters;//同上- (instancetype)initWithView:(UIView *)view;//動畫承載者@property (nonatomic, readonly) UIDragPreviewTarget* target;//動畫視圖@property (nonatomic, readonly) UIView *view;//配置參數@property (nonatomic, readonly, copy) UIDragPreviewParameters *parameters;//尺寸@property (nonatomic, readonly) CGSize size;//返回新的對象- (UITargetedDragPreview *)retargetedPreviewWithTarget:(UIDragPreviewTarget *)newTarget;

UIDragPreviewTarget主要用來設置動畫的起始視圖與結束時回歸的視圖,其中屬性方法如下:

/*初始化方法container:必須是在window上的viewcenter:動畫起點與終點transform:進行變換*/- (instancetype)initWithContainer:(UIView *)container center:(CGPoint)center transform:(CGAffineTransform)transform;//同上- (instancetype)initWithContainer:(UIView *)container center:(CGPoint)center;//對應屬性@property (nonatomic, readonly) UIView *container;@property (nonatomic, readonly) CGPoint center;@property (nonatomic, readonly) CGAffineTransform transform;

UIDragPreviewParameters用來進行拖拽動畫的配置,解析如下:

//構造方法并設置路徑矩形- (instancetype)initWithTextLineRects:(NSArray<NSValue /* CGRect */ *> *)textLineRects;//顯示的路徑@property (nonatomic, copy, nullable) UIBezierPath *visiblePath;//背景色@property (nonatomic, copy, null_resettable) UIColor *backgroundColor;

我們可以使用任意自定義的視圖來展現這個預覽動畫,如下圖所示:

iOS11,拖拽交互,拖拽的交互

十一、使用拖拽操作進行自定義數據的傳遞

本篇文章到這里,其實基本的內容都已經說完了,雖然比較詳細,也可能難免冗余,如果你耐著性子看到了這里,那么我首先欽佩你的毅力并且感謝你的耐心。其實,拖拽交互如果進行只能對系統的提供的數據類型進行操作則應用就局限太多。試想一下,如果我們可以通過拖拽商品來進行購買,拖拽聯系人來進行發送,或者在游戲中,拖拽進行卡片的融合,裝備的提煉等等這種交互操作是不是會很暢快。最后,我們就來看看如何讓自定義的數據類型支持拖拽操作。

首先你需要關注兩個協議,NSItemProviderWriting與NSItemProviderReading。Writing協議用來讓數據支持提供給數據源,Reading協議讓數據支持從數據源讀出,用自定義的Person類為例:

#import <Foundation/Foundation.h>//遵守協議@interface Person : NSObject<NSItemProviderWriting,NSItemProviderReading>//自定義內容@property(nonatomic,strong)NSString * name;@property(nonatomic,assign)NSUInteger age;@end
//.m文件@implementation Person//數據歸檔- (nullable NSProgress *)loadDataWithTypeIdentifier:(NSString *)typeIdentifier          forItemProviderCompletionHandler:(void (^)(NSData * _Nullable data, NSError * _Nullable error))completionHandler{  NSProgress * pro = [NSProgress new];  NSData * data = [NSKeyedArchiver archivedDataWithRootObject:self];  completionHandler(data,nil);  return pro;}+(NSItemProviderRepresentationVisibility)itemProviderVisibilityForRepresentationWithTypeIdentifier:(NSString *)typeIdentifier{  return NSItemProviderRepresentationVisibilityAll;}- (NSItemProviderRepresentationVisibility)itemProviderVisibilityForRepresentationWithTypeIdentifier:(NSString *)typeIdentifier{  return NSItemProviderRepresentationVisibilityAll;}//提供一個標識符+(NSArray<NSString *> *)writableTypeIdentifiersForItemProvider{  return @[@"object"];}-(NSArray<NSString *> *)writableTypeIdentifiersForItemProvider{  return @[@"object"];}- (instancetype)initWithCoder:(NSCoder *)coder{  self = [super init];  if (self) {    self.name = [coder decodeObjectForKey:@"name"];    self.age = [coder decodeIntegerForKey:@"age"];  }  return self;}- (void)encodeWithCoder:(NSCoder *)aCoder{  [aCoder encodeObject:self.name forKey:@"name"];  [aCoder encodeInteger:self.age forKey:@"age"];}//這兩個是讀協議+(NSArray<NSString *> *)readableTypeIdentifiersForItemProvider{  return @[@"object"];}//解歸檔返回+ (nullable instancetype)objectWithItemProviderData:(NSData *)data                   typeIdentifier:(NSString *)typeIdentifier                       error:(NSError **)outError{  Person * p = [NSKeyedUnarchiver unarchiveObjectWithData:data];  return p;}@end

需要注意,在拖放行為讀取數據時的類型要對應,如下:

-(void)dropInteraction:(UIDropInteraction *)interaction performDrop:(id<UIDropSession>)session{  NSLog(@"%@",session.items.lastObject.localObject);  [session loadObjectsOfClass:[Person class] completion:^(NSArray<__kindof id<NSItemProviderReading>> * _Nonnull objects) {    self.dropLabel.text = ((Person*)objects.firstObject).name;  }];}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品自产拍在线观看中文| 78m国产成人精品视频| 国产精品成人观看视频国产奇米| 国产成人在线一区| 国产精自产拍久久久久久蜜| 久久九九全国免费精品观看| 国产亚洲人成a一在线v站| 一本一道久久a久久精品逆3p| 欧美性猛交xxxx偷拍洗澡| 欧洲成人在线视频| 在线激情影院一区| 欧美日韩ab片| 久久综合免费视频影院| 亚洲欧美精品suv| 国产91精品最新在线播放| 亚洲自拍偷拍视频| 欧美激情二区三区| 日韩欧美中文在线| 亚洲天堂av图片| 亚洲欧美国产一区二区三区| 亚洲欧美在线播放| 亚洲自拍av在线| 最近免费中文字幕视频2019| 欧美亚洲国产另类| xx视频.9999.com| 精品调教chinesegay| 欧美一区二区大胆人体摄影专业网站| 亚洲最大av网站| 国产一区二区三区中文| 成人444kkkk在线观看| 国产精品视频xxx| 在线成人免费网站| 欧美专区福利在线| 日韩毛片在线观看| 亚洲最新中文字幕| 精品国产一区二区三区在线观看| 成人免费视频在线观看超级碰| 久久人人爽人人爽人人片av高请| 狠狠躁夜夜躁久久躁别揉| 国产成人拍精品视频午夜网站| 大伊人狠狠躁夜夜躁av一区| 亚洲白拍色综合图区| 欧美国产日韩中文字幕在线| 久久99热精品| 岛国av一区二区三区| 久久久久久久久久国产精品| 久久久亚洲精品视频| 欧美性xxxx18| 久久97精品久久久久久久不卡| 欧美性视频在线| 久久精品国产亚洲精品2020| 欧美老少做受xxxx高潮| 日韩美女视频中文字幕| 国产一区二区三区日韩欧美| 91精品国产九九九久久久亚洲| 国产成人一区三区| 亚洲精品影视在线观看| 亚洲一级黄色av| 精品国内自产拍在线观看| 亚洲综合日韩在线| 日韩欧美在线国产| 国内精品中文字幕| 久久精品99久久久久久久久| 日韩综合中文字幕| 4438全国亚洲精品在线观看视频| 亚洲国产日韩欧美在线99| 亚洲精品456在线播放狼人| 国产精品一区二区三| 久久精品视频网站| 国产精品美女久久| 亚洲va国产va天堂va久久| 欧美另类暴力丝袜| 在线日韩日本国产亚洲| 一本大道香蕉久在线播放29| 欧美日韩中文字幕在线视频| 不卡av在线播放| 亚洲精品在线91| 国产丝袜高跟一区| 亚洲男女自偷自拍图片另类| 久久精品国产99国产精品澳门| 色系列之999| 国产精品狼人色视频一区| 久久香蕉精品香蕉| 亚洲国产天堂久久综合网| 欧美一区二区三区免费观看| 国产日韩在线亚洲字幕中文| 国产精品你懂得| 亚洲美女精品成人在线视频| 午夜精品蜜臀一区二区三区免费| 精品国模在线视频| 欧美在线视频一区二区| 亚洲欧洲一区二区三区久久| 久久福利视频网| 一本色道久久综合亚洲精品小说| 丁香五六月婷婷久久激情| 精品一区二区三区四区在线| 97在线视频免费| 亚洲女人被黑人巨大进入| 另类视频在线观看| 亚洲成年网站在线观看| 精品伊人久久97| 亚洲女人被黑人巨大进入| 亚洲色图在线观看| 成人夜晚看av| 在线免费观看羞羞视频一区二区| 国产suv精品一区二区| 清纯唯美亚洲综合| 欧美另类xxx| yellow中文字幕久久| 亚洲区在线播放| 亚洲欧美成人在线| 成人h视频在线观看播放| 久久av资源网站| 国产女人18毛片水18精品| 国产91在线播放九色快色| 亚洲视频在线观看| 精品久久久久久久久久国产| 欧美极品美女视频网站在线观看免费| 日本精品va在线观看| 日韩国产在线播放| 国产精品美女在线| 国产成人综合精品| 久久精品国产69国产精品亚洲| 欧美日韩免费区域视频在线观看| 在线色欧美三级视频| 欧美视频一二三| 日韩美女激情视频| 神马久久久久久| 亚洲人成电影网| 国产精品高清在线观看| 另类少妇人与禽zozz0性伦| 国产一区二区三区精品久久久| 久久久精品中文字幕| 2019中文字幕在线| 538国产精品一区二区在线| 777国产偷窥盗摄精品视频| 欧美亚洲日本网站| 91麻豆国产语对白在线观看| 日韩有码在线观看| 亚洲成人a级网| 欧美激情精品在线| 亚洲已满18点击进入在线看片| 国产69精品99久久久久久宅男| 亚洲区免费影片| 18久久久久久| 91最新在线免费观看| 日本不卡视频在线播放| 国产精品吴梦梦| 中文字幕亚洲图片| 国产日本欧美一区二区三区在线| 亚洲天堂免费在线| 成人黄色在线播放| 91久久久久久久久久久久久| 久久久99免费视频| 色偷偷88888欧美精品久久久| 国产欧美精品一区二区三区-老狼| 国产亚洲精品高潮| 亚洲国产精品资源| www.日本久久久久com.| 亚洲无亚洲人成网站77777| 亚洲欧美日韩高清| 亚洲在线免费视频| 亚洲成人中文字幕| 亚洲人成电影网站色|