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

首頁 > 學院 > 開發設計 > 正文

iOS常用第三方庫之Masonry

2019-11-14 18:04:42
字體:
來源:轉載
供稿:網友

一、前言

  關于蘋果的布局一直是我比較糾結的問題,是寫代碼來控制布局,還是使用storyboard來控制布局呢?以前我個人開發的時候很少使用代碼去寫約束,因為太麻煩了。所以最終選擇的都是AutoLayout進行布局,然后拖線設置約束。不過好多公司進行iOS開發的時候都會去動態的修改約束,而且有的會使用約束去創建一些動畫,所以不太去用storyboard進行開發(還有就是使用storyboard幾個人合作的時候比較麻煩)。反倒更多的是寫代碼開發看起來更加的高效。所以好多開發者都開始去使用Masonry。它是一個封裝的第三方類庫,作用就是來簡化開發者寫布局約束。

二、“安裝”Masonry

  因為它是一個第三方的類庫,我們可以從這里下載,然后解壓將Masonry那個文件夾拖入自己的項目文件夾下即可。

三、開始使用Masonry

  我們在使用它的時候,最好在AppDelegate.m的

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

方法中去自定義加載自己的控制器。例如我寫的時候就是這樣:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];    self.window.backgroundColor = [UIColor whiteColor];    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];    self.window.rootViewController = nav;    [self.window makeKeyAndVisible];    return YES;}

直接加載的我自己寫的ViewController。(建議把系統自帶的Main.stoaryboard刪除掉,如果運行報錯自己修改,問題不大)。

先來一個不用Masonry寫的最簡單的布局:(目的是在視圖中添加一個視圖)

- (void)viewDidLoad {    [super viewDidLoad];    self.title  = @"Basic View";    UIView *view1 = [[UIView alloc] init];    view1.translatesAutoresizingMaskIntoConstraints = NO;    view1.backgroundColor = [UIColor greenColor];    [superview addSubview:view1];        UIEdgeInsets padding = UIEdgeInsetsMake(74, 10, 10, 10);        [superview addConstraints:@[                                                                //view1 constraints                                [NSLayoutConstraint constraintWithItem:view1                                                             attribute:NSLayoutAttributeTop                                                             relatedBy:NSLayoutRelationEqual                                                                toItem:superview                                                             attribute:NSLayoutAttributeTop                                                            multiplier:1.0                                                              constant:padding.top],                                                                [NSLayoutConstraint constraintWithItem:view1                                                             attribute:NSLayoutAttributeLeft                                                             relatedBy:NSLayoutRelationEqual                                                                toItem:superview                                                             attribute:NSLayoutAttributeLeft                                                            multiplier:1.0                                                              constant:padding.left],                                                                [NSLayoutConstraint constraintWithItem:view1                                                             attribute:NSLayoutAttributeBottom                                                             relatedBy:NSLayoutRelationEqual                                                                toItem:superview                                                             attribute:NSLayoutAttributeBottom                                                            multiplier:1.0                                                              constant:-padding.bottom],                                                                [NSLayoutConstraint constraintWithItem:view1                                                             attribute:NSLayoutAttributeRight                                                             relatedBy:NSLayoutRelationEqual                                                                toItem:superview                                                             attribute:NSLayoutAttributeRight                                                            multiplier:1                                                              constant:-padding.right],                                                                ]];}

運行效果如下:

這就是我們用系統的NSLayoutConstraint寫的一個view,然后將這個view加載到根view中?,F在我們用Masonry來實現和上邊一樣的效果:

第一步、導入類庫

#import "Masonry.h"

然后修改代碼如下:

- (void)viewDidLoad {    [super viewDidLoad];    self.title  = @"Basic View";    UIView *superview = self.view;        UIView *view1 = [[UIView alloc] init];    view1.translatesAutoresizingMaskIntoConstraints = NO;    view1.backgroundColor = [UIColor greenColor];    [superview addSubview:view1];        UIEdgeInsets padding = UIEdgeInsetsMake(74, 10, 10, 10);    [view1 mas_makeConstraints:^(MASConstraintMaker *make) {        make.top.equalTo(superview.mas_top).offset(padding.top);        make.left.equalTo(superview.mas_left).offset(padding.left);        make.bottom.equalTo(superview.mas_bottom).offset(-padding.bottom);        make.right.equalTo(superview.mas_right).offset(-padding.right);    }];}

上面的效果和原來用NSLayoutConstraint實現的效果是一樣的,所以就不再貼圖。

我們可以看到,我們使用的一個mas_makConstrints塊來進行約束設置。view1指代的就是要添加約束的view(也可以是button,label等等)。然后make的top,left,bottom,right就相當于view1的上下左右,然后equalTo()括號內的就是相對的view,然后offset是偏移量。

還可以更簡單的實現:

- (void)viewDidLoad {    [super viewDidLoad];    self.title  = @"Basic View";    UIView *superview = self.view;        UIView *view1 = [[UIView alloc] init];    view1.translatesAutoresizingMaskIntoConstraints = NO;    view1.backgroundColor = [UIColor greenColor];    [superview addSubview:view1];        UIEdgeInsets padding = UIEdgeInsetsMake(74, 10, 10, 10);    [view1 mas_makeConstraints:^(MASConstraintMaker *make) {        make.edges.equalTo(superview).with.insets(padding);    }];//    [view1 mas_makeConstraints:^(MASConstraintMaker *make) {//        make.top.equalTo(superview.mas_top).offset(padding.top);//        make.left.equalTo(superview.mas_left).offset(padding.left);//        make.bottom.equalTo(superview.mas_bottom).offset(-padding.bottom);//        make.right.equalTo(superview.mas_right).offset(-padding.right);//    }];}

以上的三種方式都是實現上邊圖種的效果。

MASViewAttributeNSLayoutAttribute
view.mas_leftNSLayoutAttributeLeft
view.mas_rightNSLayoutAttributeRight
view.mas_topNSLayoutAttributeTop
view.mas_bottomNSLayoutAttributeBottom
view.mas_leadingNSLayoutAttributeLeading
view.mas_trailingNSLayoutAttributeTrailing
view.mas_widthNSLayoutAttributeWidth
view.mas_heightNSLayoutAttributeHeight
view.mas_centerXNSLayoutAttributeCenterX
view.mas_centerYNSLayoutAttributeCenterY
view.mas_baselineNSLayoutAttributeBaseline

 

以上的屬性對應相應的NSLayoutAttribute。

下面就來看它的使用吧。(先上效果圖,然后再上代碼)

使用一、簡單的三個視圖的布局

這個時我直接自定義了一個ZGBasicView視圖,然后添加到了ViewController中。

關鍵代碼如下:

////  ZGBasicView.m//  MasonryDemo////  Created by zhanggui on 15/10/26.//  Copyright © 2015年 zhanggui. All rights reserved.//#import "ZGBasicView.h"#import "View+MASShorthandAdditions.h"@implementation ZGBasicView/*// Only override drawRect: if you perform custom drawing.// An empty implementation adversely affects performance during animation.- (void)drawRect:(CGRect)rect {    // Drawing code}*/- (id)init {    self = [super init];    if (!self) {        return nil;    }//        self.translatesAutoresizingMaskIntoConstraints = YES;        //紅色視圖        UIView *redView = [UIView new];        redView.backgroundColor = [UIColor redColor];        redView.layer.borderColor = [UIColor blackColor].CGColor;        redView.layer.borderWidth = 2;        [self addSubview:redView];        //綠色視圖        UIView *greenView = [[UIView alloc] init];        greenView.backgroundColor = [UIColor greenColor];        greenView.layer.borderColor = [UIColor blackColor].CGColor;        greenView.layer.borderWidth = 2;        [self addSubview:greenView];             //藍色視圖        UIView *blueView = [[UIView alloc] init];        blueView.backgroundColor = [UIColor blueColor];        blueView.layer.borderWidth = 2;        blueView.layer.borderColor = [UIColor blackColor].CGColor;                [self addSubview:blueView];                        int padding = 10;        UIView *superview = self;                      //with is semantic and option        [redView mas_makeConstraints:^(MASConstraintMaker *make) {            make.top.equalTo(superview.mas_top).offset(padding); //with with            make.left.equalTo(greenView.mas_right).offset(padding); //without with            make.bottom.equalTo(blueView.mas_top).offset(-padding);            make.right.equalTo(superview.mas_right).offset(-padding);            make.width.equalTo(greenView.mas_width);                        make.height.equalTo(@[greenView, blueView]); //can pass array of views        }];        [greenView mas_makeConstraints:^(MASConstraintMaker *make) {            make.top.equalTo(superview.mas_top).offset(padding);            make.left.equalTo(superview.mas_left).offset(padding);            make.bottom.equalTo(blueView.mas_top).offset(-padding);            make.right.equalTo(redView.mas_left).offset(-padding);            make.width.equalTo(redView.mas_width);                        make.height.equalTo(redView.mas_height);//            make.height.equalTo(blueView.mas_height);        }];        [blueView mas_makeConstraints:^(MASConstraintMaker *make) {            make.top.equalTo(greenView.mas_bottom).offset(padding);            make.left.equalTo(superview.mas_left).offset(padding);            make.bottom.equalTo(superview.mas_bottom).offset(-padding);            make.right.equalTo(superview.mas_right).offset(-padding);            make.height.equalTo(greenView.mas_height); //can pass array of attributes        }];    return self;}@end

三個視圖之間的關系。

場景二、更新視圖

效果圖如下:

實現代碼如下:(這里也是自定義了一個View,然后將這個view加入到了根視圖中)

////  UpdateConstraintsView.m//  MasonryDemo////  Created by zhanggui on 15/10/26.//  Copyright © 2015年 zhanggui. All rights reserved.//#import "UpdateConstraintsView.h"#import "Masonry.h"@interface UpdateConstraintsView ()@PRoperty (nonatomic,strong)UIButton *myButton;@property (nonatomic,assign)CGSize buttonSize;@end@implementation UpdateConstraintsView- (id)init {    self = [super init];    if (self) {        self.myButton = [UIButton buttonWithType:UIButtonTypeSystem];        [self.myButton setTitle:@"更新約束" forState:UIControlStateNormal];        self.myButton.layer.borderColor = [UIColor blackColor].CGColor;        self.myButton.layer.borderWidth = 2;        [self.myButton addTarget:self action:@selector(changeAction:) forControlEvents:UIControlEventTouchUpInside];        [self addSubview:self.myButton];        self.buttonSize = CGSizeMake(100, 100);    }    return self;}/** Returns whether the receiver depends on the constraint-based layout system. YES if the view must be in a window using constraint-based layout to function properly, NO otherwise. */+ (BOOL)requiresConstraintBasedLayout {    return YES;}/** Updates constraints for the view. Custom views that set up constraints themselves should do so by overriding this method. When your custom view notes that a change has been made to the view that invalidates one of its constraints, it should immediately remove that constraint, and then call setNeedsUpdateConstraints to note that constraints need to be updated. Before layout is performed, your implementation of updateConstraints will be invoked, allowing you to verify that all necessary constraints for your content are in place at a time when your custom view’s properties are not changing. You must not invalidate any constraints as part of your constraint update phase. You also must not invoke a layout or drawing phase as part of constraint updating. Important:Important Call [super updateConstraints] as the final step in your implementation. 蘋果推薦在這個方法里面添加或者更新約束 */- (void)updateConstraints {    [self.myButton mas_updateConstraints:^(MASConstraintMaker *make) {        make.center.equalTo(self);        make.width.equalTo(@(self.buttonSize.width)).priorityLow();  //設置優先級以及width        make.height.equalTo(@(self.buttonSize.height)).priorityLow();        //設置myButton的大小小于等于自身view的大小        make.width.lessThanOrEqualTo(self);        make.height.lessThanOrEqualTo(self);    }];    [super updateConstraints];}- (void)changeAction:(UIButton *)button {    self.buttonSize = CGSizeMake(self.buttonSize.width*1.2, self.buttonSize.height*1.2);    //告訴約束他們需要更新    [self setNeedsUpdateConstraints];    //update constraints now    [self updateConstraintsIfNeeded];    //設置更新大小動畫    [UIView animateWithDuration:0.5 animations:^{        /**         Lays out the subviews immediately.         Use this method to force the layout of subviews before drawing. Using the view that receives the message as the root view, this method lays out the view subtree starting at the root.         */        [self layoutIfNeeded];    }];}@end

這里主要使用了mas_updateConstraints:方法

場景三、讓約束復原

實現代碼如下:

////  ReBackConstraintsView.m//  MasonryDemo//可以恢復原來的約束//  Created by zhanggui on 15/10/26.//  Copyright © 2015年 zhanggui. All rights reserved.//#import "ReBackConstraintsView.h"#import "Masonry.h"@interface ReBackConstraintsView ()@property (nonatomic,strong)UIButton *myButton;@property (nonatomic,assign)BOOL isAtTop;@end@implementation ReBackConstraintsView- (id)init {    self = [super init];    if (self) {        self.myButton = [UIButton buttonWithType:UIButtonTypeSystem];;        [self.myButton setTitle:@"Move Me!" forState:UIControlStateNormal];        self.myButton.layer.borderColor = UIColor.greenColor.CGColor;        self.myButton.layer.borderWidth = 3;                [self.myButton addTarget:self action:@selector(moveAction:) forControlEvents:UIControlEventTouchUpInside];        [self addSubview:self.myButton];                self.isAtTop = YES;            }    return self;}+ (BOOL)requiresConstraintBasedLayout {    return YES;}- (void)updateConstraints {    [self.myButton mas_remakeConstraints:^(MASConstraintMaker *make) {        make.width.equalTo(@(100));        make.height.equalTo(@(100));        if (self.isAtTop) {            make.left.equalTo(self.mas_left).offset(10);            make.top.equalTo(self.mas_top).offset(10);        }else {            make.bottom.equalTo(self.mas_bottom).offset(-10);            make.right.equalTo(self.mas_right).offset(-10);                                                        }    }];        [super updateConstraints];}- (void)moveAction:(UIButton *)myButton {    self.isAtTop = !self.isAtTop;    //告訴約束他們需要更新    [self setNeedsUpdateConstraints];    //立刻更新視圖約束    [self updateConstraintsIfNeeded];    [UIView animateWithDuration:0.3 animations:^{        [self layoutIfNeeded];    }];}/*// Only override drawRect: if you perform custom drawing.// An empty implementation adversely affects performance during animation.- (void)drawRect:(CGRect)rect {    // Drawing code}*/@end

這里主要使用了mas_remakeConstraints:方法。

場景四、兩個視圖的嵌套

實現代碼:

////  NestConstraintsView.m//  MasonryDemo////  Created by zhanggui on 15/10/26.//  Copyright © 2015年 zhanggui. All rights reserved.//#import "NestConstraintsView.h"#import "Masonry.h"@implementation NestConstraintsView- (id)init {    self = [super init];    if (self) {        UIView *bigView = [[UIView alloc] init];        bigView.backgroundColor = [UIColor blackColor];        [self addSubview:bigView];                UIView *smallView = [[UIView alloc] init];        smallView.backgroundColor = [UIColor redColor];        [self addSubview:smallView];                [bigView mas_makeConstraints:^(MASConstraintMaker *make) {            make.top.equalTo(self).offset(20);            make.left.equalTo(self).offset(20);            make.bottom.equalTo(self).offset(-20);            make.right.equalTo(self).offset(-20);        }];        [smallView mas_makeConstraints:^(MASConstraintMaker *make) {            make.top.equalTo(bigView.mas_top).offset(40);            make.left.equalTo(bigView.mas_left).offset(40);            make.bottom.equalTo(bigView.mas_bottom).offset(-40);            make.right.equalTo(bigView.mas_right).offset(-40);        }];    }    return self;}@end

這里和第一個場景一樣,都是最基本的實現約束的添加,只不過相對參照物不同。

場景五、多個view一起布局(以組為單位布局)

效果:

實現代碼:

////  GroupButtonView.m//  MasonryDemo////  Created by zhanggui on 15/10/26.//  Copyright © 2015年 zhanggui. All rights reserved.//#import "GroupButtonView.h"#import "Masonry.h"@implementation GroupButtonView- (instancetype)init {    self  = [super init];    if (self) {        NSArray *strArr = @[@"10",@"20",@"50",@"100",@"200",@"300"];        NSMutableArray *mutableArr = [[NSMutableArray alloc] initWithCapacity:6];        for (int i=0; i<3; i++) {            UIButton *button = [[UIButton alloc] init];            [button setTitle:strArr[i] forState:UIControlStateNormal];            [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];            button.layer.borderColor = [UIColor blackColor].CGColor;            [button addTarget:self action:@selector(show:) forControlEvents:UIControlEventTouchUpInside];            button.layer.borderWidth = 2;            [self addSubview:button];            [mutableArr addObject:button];        }                [mutableArr mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:20 leadSpacing:20 tailSpacing:20];                [mutableArr mas_makeConstraints:^(MASConstraintMaker *make) {                    make.top.equalTo(@120);                    make.height.equalTo(@75);                }];        /**         *  -----------------------         */        NSMutableArray *marr = [NSMutableArray new];        for (int i=3; i<6; i++) {            UIButton *button = [[UIButton alloc] init];            [button setTitle:strArr[i] forState:UIControlStateNormal];            [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];            button.layer.borderColor = [UIColor blackColor].CGColor;            [button addTarget:self action:@selector(show:) forControlEvents:UIControlEventTouchUpInside];            button.layer.borderWidth = 2;            [self addSubview:button];            [marr addObject:button];        }                [marr mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:20 leadSpacing:20 tailSpacing:20];        [marr mas_makeConstraints:^(MASConstraintMaker *make) {            make.top.equalTo(@200);            make.height.equalTo(@75);        }];                }    return self;}- (void)show:(UIButton *)button{    NSLog(@"%@",button.titleLabel.text);}@end

在這里,我們主要就是用到了mas_distributeViewsAlongAxis:...這個方法,來萬曾一組視圖的布局。

場景六、自己寫的一個簡單的登錄界面

效果如下:

代碼如下:

////  ViewController.m//  MasonryDemo////  Created by zhanggui on 15/10/8.//  Copyright © 2015年 zhanggui. All rights reserved.//#import "ViewController.h"#import "Masonry.h"#import "ZGBasicView.h"#import "UpdateConstraintsView.h"#import "ReBackConstraintsView.h"#import "NestConstraintsView.h"#import "GroupButtonView.h"#import "LoginView.h"#import "ArrayView.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    self.title  = @"登錄";        [self loginView];//    [self addArrayView];}- (void)loginView {    LoginView *loginView = [[LoginView alloc] init];    self.view = loginView;//    loginView.frame = self.view.frame;//    [self.view addSubview:loginView];}- (void)addArrayView {    ArrayView *arrView = [[ArrayView alloc] init];    self.view = arrView;}- (void)groupButtonView {    GroupButtonView *nestView = [[GroupButtonView alloc] init];    nestView.frame = self.view.frame;//    self.view = nestView;    [self.view addSubview:nestView];}- (void)nestConstraintsView {    NestConstraintsView *nestView = [[NestConstraintsView alloc] init];    self.view = nestView;}- (void)reBackConstraints {    ReBackConstraintsView *rebackView = [[ReBackConstraintsView alloc] init];    self.view = rebackView;}- (void)updateConstraintsView {    UpdateConstraintsView *updateView = [[UpdateConstraintsView alloc] init];    self.view = updateView;}- (void)simpleView {    ZGBasicView *basicView = [[ZGBasicView alloc] init];//    [self.view addSubview:basicView];    self.view = basicView;}- (void)firstSimpleView {    UIView *superview = self.view;    UIView *view1 = [[UIView alloc] init];    view1.translatesAutoresizingMaskIntoConstraints = NO;    view1.backgroundColor = [UIColor greenColor];    [superview addSubview:view1];        UIEdgeInsets padding = UIEdgeInsetsMake(74, 10, 10, 10);    [view1 mas_makeConstraints:^(MASConstraintMaker *make) {        make.edges.equalTo(superview).with.insets(padding);    }];    //    [view1 mas_makeConstraints:^(MASConstraintMaker *make) {    //        make.top.equalTo(superview.mas_top).offset(padding.top);    //        make.left.equalTo(superview.mas_left).offset(padding.left);    //        make.bottom.equalTo(superview.mas_bottom).offset(-padding.bottom);    //        make.right.equalTo(superview.mas_right).offset(-padding.right);    //    }];}@end

大家可以簡單的看一下,寫的比較簡單,應該很容易理解的。(橫屏的距離上邊的高度沒有處理太好,將就著看吧)

簡單就介紹這么多了。

附:

  1、源碼下載地址:http://pan.baidu.com/s/1o6083G2

  2、Masonry Git地址:https://github.com/SnapKit/Masonry

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩一区二区三区在线| 亚洲精品福利在线| 午夜精品一区二区三区视频免费看| 国产成人涩涩涩视频在线观看| 久久久女人电视剧免费播放下载| 国产成人综合精品在线| 亚洲va久久久噜噜噜| 国产精品777| 日韩电影中文 亚洲精品乱码| 亚洲视频欧洲视频| 欧美理论电影网| 国产成人综合精品| 2023亚洲男人天堂| 成人a在线视频| 在线播放亚洲激情| 亚洲最大福利视频| 久久精品国产精品亚洲| 国产精品丝袜久久久久久高清| 亚洲精品在线观看www| 国产成人亚洲综合青青| 在线观看国产欧美| 九九热最新视频//这里只有精品| 亚洲精品第一国产综合精品| 久久久成人精品| 一区二区亚洲精品国产| 国产91精品久| 日韩精品免费电影| 国产99久久久欧美黑人| 欧美裸体xxxx| 亚洲国产成人久久综合| 91中文字幕在线观看| 成人有码视频在线播放| 日韩精品一区二区三区第95| 欧美精品久久久久久久| 欧美成人合集magnet| 神马久久桃色视频| 欧美日韩中文字幕日韩欧美| 亚洲国产精品久久91精品| 欧美日韩成人在线视频| 国产亚洲视频在线| 国产成人在线亚洲欧美| 国产国产精品人在线视| 欧美电影免费观看| 欧美性生交大片免网| 久久视频在线播放| 欧美性极品xxxx做受| 亚洲欧美另类中文字幕| 欧美高清理论片| 成人黄色激情网| 亚洲国产精品高清久久久| 91精品综合久久久久久五月天| 欧美性videos高清精品| 亚洲免费电影一区| 欧美激情综合色综合啪啪五月| 91免费综合在线| 国产性猛交xxxx免费看久久| 精品福利樱桃av导航| 成人在线观看视频网站| 麻豆精品精华液| 亚洲综合一区二区不卡| 欧美在线精品免播放器视频| 欧美性理论片在线观看片免费| 欧美成人精品影院| 亚洲第一福利网| 久久久av电影| 国产精品欧美一区二区| 亚洲欧美在线看| 日韩欧美成人免费视频| 国外成人性视频| 2020久久国产精品| 国产ts一区二区| 国产一区二区三区视频在线观看| 久久久天堂国产精品女人| 精品magnet| 久久国内精品一国内精品| 国产精品99久久久久久白浆小说| 国产成人精品综合| 日韩精品亚洲视频| 久久视频在线视频| 中文字幕精品影院| 日韩欧美中文在线| 欧美一级电影免费在线观看| 91久久在线观看| 日韩欧美在线第一页| 97在线观看免费高清| 欧洲亚洲妇女av| 亚洲色图35p| 粗暴蹂躏中文一区二区三区| 91影院在线免费观看视频| 久久久久久久久久久91| 亚洲激情视频在线播放| 日日骚久久av| 国产精品久久久久福利| 成人两性免费视频| 奇米一区二区三区四区久久| 国产一区二区三区在线看| 欧美激情综合色| 成人免费直播live| 成人高清视频观看www| 国产精品久久精品| 欧美日韩在线影院| 亚洲无av在线中文字幕| yw.139尤物在线精品视频| 久久久久久久久91| 亚洲大胆人体av| 久久亚洲精品国产亚洲老地址| 青青久久av北条麻妃黑人| 午夜精品一区二区三区在线视频| 欧美最猛性xxxxx亚洲精品| 午夜精品久久久久久久99热浪潮| 黄色成人在线免费| 午夜精品久久17c| 国产亚洲激情视频在线| 在线观看欧美成人| 最近2019年日本中文免费字幕| 国产精品国产亚洲伊人久久| 欧美做受高潮1| 欧美在线视频在线播放完整版免费观看| 久久精品男人天堂| 69国产精品成人在线播放| 国产精品久久久久久亚洲调教| 国产一区二区三区在线观看网站| 超碰97人人做人人爱少妇| 日本亚洲欧美成人| 日韩中文字幕精品| 国产一区二区三区在线| 国产精品视频yy9099| 欧美精品videosex性欧美| 久久久久久久久久国产精品| 欧美在线激情视频| 国产精品青草久久久久福利99| 国产97色在线|日韩| 久久99久久99精品免观看粉嫩| 国产z一区二区三区| 中文字幕亚洲一区二区三区| 午夜精品久久久久久99热| 中日韩美女免费视频网址在线观看| 亚洲成年人影院在线| 一本色道久久88综合日韩精品| 国产成人精品视频| 色偷偷偷亚洲综合网另类| 亚洲精品美女免费| 激情懂色av一区av二区av| 亚洲国产一区二区三区在线观看| 亚洲视频在线播放| 日韩精品视频在线播放| 欧美在线免费看| 成人动漫网站在线观看| 日韩欧美精品网站| 亚洲精品视频二区| 成人网址在线观看| 97精品在线观看| 欧美日韩国产在线| 在线观看日韩视频| 国产一区二区三区在线| 亚洲一区二区中文| 国产精品网红福利| 5278欧美一区二区三区| 久久久精品欧美| 久久久精品2019中文字幕神马| 成人乱人伦精品视频在线观看| 国产成人97精品免费看片| 亚洲天堂开心观看| 久久人体大胆视频|