日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

swift和swiftui_在swiftui中查看布局和演示

發布時間:2024/1/8 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 swift和swiftui_在swiftui中查看布局和演示 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

swift和swiftui

您一直在等待的完整SwiftUI 2文檔 (The Complete SwiftUI 2 Documentation You’ve Been Waiting For)

At the start of 2020, I wrote a long Medium article called “The Complete SwiftUI Documentation You’ve Been Waiting For.”

在2020年初,我寫了一篇很長的中型文章,名為“ 您一直在等待的完整SwiftUI文檔 。”

This was my way of sharing what I learned when I tried to fill in the gaps left by the insufficient documentation provided by Apple.

這是我分享我嘗試填補Apple提供的文檔不足所留下的空白時所學到的知識的方式。

Although my article seemed to help a lot of people, I also wrote it eight months late.

盡管我的文章似乎對很多人有幫助,但我也寫了八個月。

Now that Apple’s 2020 developer conference is over, SwiftUI has been given some new capabilities, so hopefully, this update will make my documentation more helpful than ever before. This will be released as a series, with one chapter per article. The names of these chapters correspond with the chapter names in Apple’s SwiftUI documentation. They can be read in any order, so that’s why I’m not numbering them.

現在,Apple的2020年開發人員大會已經結束,SwiftUI已獲得一些新功能,因此希望此更新將使我的文檔比以往任何時候都更有幫助。 這將作為系列發布,每篇文章一個章節。 這些章節的名稱與Apple的SwiftUI文檔中的章節名稱相對應。 可以按任何順序讀取它們,所以這就是為什么我不給它們編號。

As I promised, the current chapter isn’t as long as “Views and Controls,” which was longer than my original documentation!

如我所言,本章不如“視圖和控件”長,它比我的原始文檔還要長!

  • View Layout and Presentation

    查看布局和演示

  • Views and Controls

    視圖和控件

  • App Structure and Behavior

    應用結構和行為
  • Drawing and Animation

    繪畫與動畫
  • Framework Integration

    框架整合
  • State and Data Flow

    狀態和數據流
  • Gestures

    手勢
  • Preview

    預習

I encourage you to contact me in a response below if you spot any mistakes or a subject you think I should cover in more detail.

如果您發現任何錯誤或您認為我應該更詳細介紹的主題,建議您在以下答復中與我聯系。

LazyHStack and LazyVStack (New in 2.0)LazyVGrid (New in 2.0)LazyHGrid (New in 2.0)GridItem (New in 2.0)List (Updated in 2.0)ForEach & DynamicViewContent (Updated in 2.0)ScrollViewReader (New in 2.0)ScrollViewProxy (New in 2.0)Group (Updated in 2.0)Groupbox (Updated), OutlineGroup (NEW), & DisclosureGroup (NEW)NavigationView (Updated in 2.0)TabView (Updated in 2.0)

LazyHStack和LazyVStack(2.0中的新增功能) (LazyHStack and LazyVStack (New in 2.0))

Back to contents ↑

返回目錄↑

One thing that was pretty ambiguous in the first iteration of SwiftUI was whether the rows of a List are queued or not.

在SwiftUI的第一次迭代中,一個很不明確的事情是List的行是否排隊。

When you scroll on a UITableView, cells that leave the bottom or top of the screen are added to a queue, meaning that every cell in the table does not have to be stored in memory at once. When a cell is about to be scrolled into view, a method like func dequeueReusableCell(withIdentifier: String) -> UITableViewCell? is called. The cells are considered to be reusable, since they can be destroyed and recreated, and removing them from the queue is called dequeueing.

在UITableView上滾動時,離開屏幕底部或頂部的單元格將添加到隊列中,這意味著表中的每個單元格不必一次存儲在內存中。 當一個單元格要滾動到視圖中時,類似func dequeueReusableCell(withIdentifier: String) -> UITableViewCell? 叫做。 單元被認為是可重用的,因為它們可以被銷毀和重新創建,并且將它們從隊列中刪除稱為出隊 。

Anyway, it turns out that List does reuse cells. But if you want to use a ScrollView instead, you’re back to everything loading at once and not queuing when they leave the top or bottom of the screen. You might be okay with using List instead of a verticalScrollView, but what happens if you want to scroll horizontally?

無論如何,事實證明List 確實重用了cell 。 但是,如果您要使用ScrollView ,則可以返回到一次加載的所有內容,并且當它們離開屏幕頂部或底部時不會排隊。 使用List而不是垂直的ScrollView可能會沒事,但是如果要水平滾動會怎樣?

If you try it, you’ll notice that List has no option to scroll horizontally.

如果嘗試,您會發現List沒有水平滾動的選項。

struct ContentView: View {@State var text = ""var body: some View {VStack {WhatJustHappenedView(text: text)ScrollView(.horizontal) {MyLazyHStack(text: $text)}.frame(height: 50)ScrollView(.vertical) {MyLazyVStack(text: $text)}}} }struct WhatJustHappenedView: View {let text: String@State var toggleIsOn = truevar body: some View {Group {Toggle(isOn: $toggleIsOn) {Text("Show what just happened")}.padding(.top)if toggleIsOn {Text("What just happened?")Text("\(text)")}}.padding(.horizontal)} }struct MyLazyHStack: View {@Binding var text: Stringvar body: some View {LazyHStack {ForEach(0..<150, id: \.self) {index inText("LazyHStack \(index)").onAppear {text = "LazyHStack \(index) appeared"print(text)}.onDisappear {text = "LazyHStack \(index) disappeared"print(text)}}}} }struct MyLazyVStack: View {@Binding var text: Stringvar body: some View {LazyVStack {ForEach(0..<150, id: \.self) {index inText("LazyVStack \(index)").onAppear {text = "LazyVStack \(index) appeared"print(text)}.onDisappear {text = "LazyVStack \(index) disappeared"print(text)}}}} }

In my example, we have an aptly named WhatJustHappenedView, which prints the most recent queueing event. If the stacks weren’t lazy, every Text cell inside them would appear once at the beginning, and they would never disappear when they are queued.

在我的示例中,我們有一個恰當地命名為WhatJustHappenedView ,它打印最近的排隊事件。 如果堆棧不是惰性的,則其中的每個Text單元格將在開始時出現一次,并且在排隊時它們永遠不會消失。

Instead, we see the events that prove that our memory is being allocated dynamically and not all at once.

相反,我們看到的事件證明了我們的內存是動態分配的,而不是一次分配。

LazyVGrid(2.0中的新增功能) (LazyVGrid (New in 2.0))

Back to contents ↑

返回目錄↑

You can apply the same logic of the LazyVStack and LazyHStack section above to a grid. What if we want to lay views out in rows and columns in SwiftUI? In the original version, there was no way to go about this other than manually coding your own logic, of course! The LazyVGrid bears a lot of visual similarity to the UICollectionView from UIKit, but it’s a lot easier to implement. You can construct these grids using an array of GridItem objects, which can act as rows in your layout.

您可以將上面的LazyVStack和LazyHStack部分的相同邏輯應用于網格。 如果我們想在SwiftUI中按行和列布局視圖怎么辦? 當然,在原始版本中,除了手動編碼自己的邏輯外,別無他法! UICollectionView與UIKit中的LazyVGrid具有很多視覺相似性,但是實現起來容易UICollectionView 。 您可以使用GridItem對象數組構造這些網格,這些對象可以在布局中充當行。

To make it easier to see the effect of changing properties of your grids, I’ve created a convenient way to lay out six steppers called SteppersView. I’m going to be providing examples that are sized using .fixed, .adaptive, and .relative sizing types. These are all cases of the enum GridItem.Size, and while .fixed requires only one CGFloat value, the other two require a minimum and maximum for the system to choose a value between.

為了更輕松地查看更改網格屬性的效果,我創建了一種方便的方法來布置六個名為SteppersView的步進器。 我將要提供使用大小的例子.fixed , .adaptive和.relative大小類型。 這些都是枚舉GridItem.Size所有情況,而.fixed僅需要一個CGFloat值,而其他兩個則需要最小值和最大值,系統才能在其中選擇一個值。

First we have .fixed, which gives an explicit width to the columns of the LazyVGrid:

首先,我們有.fixed ,這給出了一個明確的寬度到的列LazyVGrid :

// Requires SteppersView which can be found here: // https://gist.github.com/sturdysturge/eed04e007cef3222729663d9eed0d7d6import SwiftUIstruct ContentView: View {@State var column1Width: CGFloat = 20.0@State var column2Width: CGFloat = 20.0@State var column3Width: CGFloat = 20.0@State var column1Spacing: CGFloat = 50.0@State var column2Spacing: CGFloat = 50.0@State var column3Spacing: CGFloat = 50.0let rows = 50let columns = 3var body: some View {VStack {SteppersView(control1A: ("Column 1 Width", $column1Width),control1B: ("Column 1 Spacing", $column1Spacing),control2A: ("Column 2 Width", $column2Width),control2B: ("Column 2 Spacing", $column2Spacing),control3A: ("Column 3 Width", $column3Width),control3B: ("Column 3 Spacing", $column3Spacing))ScrollView(.vertical) {LazyVGrid(columns: [GridItem(.fixed(column1Width), spacing: column1Spacing),GridItem(.fixed(column2Width), spacing: column2Spacing),GridItem(.fixed(column3Width), spacing: column3Spacing)], alignment: .center, spacing: 19) {ForEach(0..<(columns * rows), id: \.self) {index inRectangle().foregroundColor(.red).frame(height: 25)}}}.frame(maxWidth: .infinity).padding(.vertical)Spacer()}} }

Now we have .flexible, which allows the columns to grow to the maximum width they have available. This is similar to using the .frame(maxWidth: .infinity) modifier on any other view. Although columns can grow or shrink according to the requirements of those around them, they cannot change the number of columns in a row. This means that we still end up with an appropriate number of rows, as is seen if you scroll to the bottom and see that the bottom row has the same number as all previous rows.

現在我們有了.flexible ,它可以使列增長到可用的最大寬度。 這類似于在其他任何視圖上使用.frame(maxWidth: .infinity)修飾符。 盡管可以根據周圍的列的要求來增加或縮小列,但是它們不能更改一行中的列數。 這意味著我們仍然可以得到適當數量的行,就像您滾動到底部并看到最底部的行與所有先前的行具有相同的行數一樣。

// Requires SteppersView which can be found here: // https://gist.github.com/sturdysturge/eed04e007cef3222729663d9eed0d7d6import SwiftUIstruct LazyVGridFlexibleView: View {@State var column1MinWidth: CGFloat = 50.0@State var column2MinWidth: CGFloat = 50.0@State var column3MinWidth: CGFloat = 50.0@State var column1MaxWidth: CGFloat = 50.0@State var column2MaxWidth: CGFloat = 50.0@State var column3MaxWidth: CGFloat = 50.0let rows = 50let columns = 3var body: some View {VStack {SteppersView(control1A: ("Column 1 Min Width", $column1MinWidth),control1B: ("Column 1 Max Width", $column1MaxWidth),control2A: ("Column 2 Min Width", $column2MinWidth),control2B: ("Column 2 Max Width", $column2MaxWidth),control3A: ("Column 3 Min Width", $column3MinWidth),control3B: ("Column 3 Max Width", $column3MaxWidth))ScrollView(.vertical) {LazyVGrid(columns: [GridItem(.flexible(minimum: column1MinWidth, maximum: column1MaxWidth)),GridItem(.flexible(minimum: column2MinWidth, maximum: column2MaxWidth)),GridItem(.flexible(minimum: column3MinWidth, maximum: column3MaxWidth)),]) {ForEach(0..<(columns * rows), id: \.self) {index inRectangle().foregroundColor(.red).frame(height: 25)}}}.frame(maxWidth: .infinity).padding(.vertical)Spacer()}} }

GridItem.Size.adaptive is different from .flexible in one simple way. While these cells still have a minimum and maximum width, they will not prevent cells from the row below moving up in order to occupy available space. This is assuming that the available space is larger than the minimum width that the cells can occupy, of course. The difference here can be observed most clearly when scrolling to the bottom, as it is easy to achieve a situation in which the last row has less cells in it than the previous rows.

GridItem.Size.adaptive與.flexible以一種簡單的方式不同。 盡管這些單元格仍具有最小和最大寬度,但它們不會阻止下一行的單元格向上移動以占用可用空間。 當然,這是假定可用空間大于單元格可以占用的最小寬度。 滾動到底部時,可以最清楚地觀察到此處的差異,因為很容易實現最后一行中的單元格少于前一行的情況。

This is because the number of cells we calculated using columns * rows is no longer an accurate representation of the cells, as there are more items per row than previously expected.

這是因為我們使用columns * rows計算的單元格數量不再是單元格的準確表示,因為每行中的項目比以前預期的要多。

// Requires SteppersView which can be found here: // https://gist.github.com/sturdysturge/eed04e007cef3222729663d9eed0d7d6import SwiftUIstruct ContentView: View {@State var column1MinWidth: CGFloat = 50.0@State var column2MinWidth: CGFloat = 50.0@State var column3MinWidth: CGFloat = 50.0@State var column1MaxWidth: CGFloat = 50.0@State var column2MaxWidth: CGFloat = 50.0@State var column3MaxWidth: CGFloat = 50.0let rows = 50let columns = 3var body: some View {VStack {SteppersView(control1A: ("Column 1 Min Width", $column1MinWidth),control1B: ("Column 1 Max Width", $column1MaxWidth),control2A: ("Column 2 Min Width", $column2MinWidth),control2B: ("Column 2 Max Width", $column2MaxWidth),control3A: ("Column 3 Min Width", $column3MinWidth),control3B: ("Column 3 Max Width", $column3MaxWidth))ScrollView(.vertical) {LazyVGrid(columns: [GridItem(.adaptive(minimum: column1MinWidth, maximum: column1MaxWidth)),GridItem(.adaptive(minimum: column2MinWidth, maximum: column2MaxWidth)),GridItem(.adaptive(minimum: column3MinWidth, maximum: column3MaxWidth)),]) {ForEach(0..<(columns * rows), id: \.self) {index inRectangle().foregroundColor(.red).frame(height: 25)}}}.frame(maxWidth: .infinity).padding(.vertical)Spacer()}} }

LazyHGrid(2.0中的新增功能) (LazyHGrid (New in 2.0))

Back to contents ↑

返回目錄↑

Like LazyVGrid above, the examples here require controls so that you can play around with them in the subsequent examples. All of the examples use six different steppers, so I’ve provided SteppersView, which allows you to lay them out for each example.

與上面的LazyVGrid一樣,此處的示例也需要控件,以便您可以在后續示例中使用它們。 所有示例都使用六個不同的步進器,因此我提供了SteppersView ,它允許您為每個示例布置它們。

// Requires StepperView which can be found here: // https://gist.github.com/sturdysturge/eed04e007cef3222729663d9eed0d7d6import SwiftUIstruct LazyHGridFixedView: View {@State var row1Height: CGFloat = 20.0@State var row2Height: CGFloat = 20.0@State var row3Height: CGFloat = 20.0@State var row1Spacing: CGFloat = 50.0@State var row2Spacing: CGFloat = 50.0@State var row3Spacing: CGFloat = 50.0let columns = 50let rows = 3var body: some View {VStack {SteppersView(control1A: ("Row 1 Height", $row1Height),control1B: ("Row 1 Spacing", $row1Spacing),control2A: ("Row 2 Height", $row2Height),control2B: ("Row 2 Spacing", $row2Spacing),control3A: ("Row 3 Height", $row3Height),control3B: ("Row 3 Spacing", $row3Spacing))ScrollView(.horizontal) {LazyHGrid(rows: [GridItem(.fixed(row1Height), spacing: row1Spacing),GridItem(.fixed(row2Height), spacing: row2Spacing),GridItem(.fixed(row3Height), spacing: row3Spacing)], alignment: .center, spacing: 19) {ForEach(0..<(columns * rows), id: \.self) {index inRectangle().foregroundColor(.red).frame(width: 25)}}}.frame(maxHeight: .infinity).padding(.vertical)Spacer()}} }

Now we have .flexible, which allows the rows to grow to the maximum height they have available. This is similar to using the .frame(maxHeight: .infinity) modifier on any other view. Although columns can grow or shrink according to the requirements of those around them, they cannot change the number of rows in a column. This means that we still end up with an appropriate number of columns, as is seen if you scroll to the right and see that the last column has the same number as all previous columns.

現在我們有了.flexible ,它可以使行增長到可用的最大高度。 這類似于在其他任何視圖上使用.frame(maxHeight: .infinity)修飾符。 盡管可以根據周圍的列的要求來增加或縮小列,但是它們不能更改列中的行數。 這意味著我們仍然可以得到適當數量的列,就像您向右滾動并看到最后一列具有與所有先前列相同的列數一樣。

// Requires SteppersView which can be found here: // https://gist.github.com/sturdysturge/eed04e007cef3222729663d9eed0d7d6import SwiftUIstruct LazyHGridAdaptiveView: View {@State var row1MinHeight: CGFloat = 50.0@State var row2MinHeight: CGFloat = 50.0@State var row3MinHeight: CGFloat = 50.0@State var row1MaxHeight: CGFloat = 50.0@State var row2MaxHeight: CGFloat = 50.0@State var row3MaxHeight: CGFloat = 50.0let columns = 50let rows = 3var body: some View {VStack {SteppersView(control1A: ("Row 1 Min Height", $row1MinHeight),control1B: ("Row 1 Max Height", $row1MaxHeight),control2A: ("Row 2 Min Height", $row2MinHeight),control2B: ("Row 2 Max Height", $row2MaxHeight),control3A: ("Row 3 Min Height", $row3MinHeight),control3B: ("Row 3 Max Height", $row3MaxHeight))ScrollView(.horizontal) {LazyHGrid(rows: [GridItem(.adaptive(minimum: row1MinHeight, maximum: row1MaxHeight)),GridItem(.adaptive(minimum: row2MinHeight, maximum: row2MaxHeight)),GridItem(.adaptive(minimum: row3MinHeight, maximum: row3MaxHeight)),], alignment: .center, spacing: 19) {ForEach(0..<(columns * rows), id: \.self) {index inRectangle().foregroundColor(.red).frame(width: 25)}}}.frame(maxHeight: .infinity).padding(.vertical)Spacer()}} }

GridItem.Size.adaptive is different from .flexible in one simple way. While these cells still have a minimum and maximum height, they will not prevent cells from the column to the right moving left in order to occupy available space. This is assuming that the available space is larger than the minimum height that the cells can occupy, of course. The difference here can be observed most clearly when scrolling to the right, as it is easy to achieve a situation in which the last column has less cells in it than the previous columns.

GridItem.Size.adaptive與.flexible以一種簡單的方式不同。 盡管這些單元格仍具有最小和最大高度,但它們不會阻止從列到右側的單元格向左移動以占用可用空間。 當然,這是假定可用空間大于單元格可以占用的最小高度。 向右滾動時,可以最清楚地觀察到此處的差異,因為很容易實現最后一列的單元格少于前一列的情況。

This is because the number of cells we calculated using columns * rows is no longer an accurate representation of the cells, as there are more items per column than previously expected.

這是因為我們使用columns * rows計算的單元格數量不再是單元格的準確表示,因為每列中的項比以前預期的要多。

// Requires SteppersView which can be found here: // https://gist.github.com/sturdysturge/eed04e007cef3222729663d9eed0d7d6import SwiftUIstruct LazyHGridFlexibleView: View {@State var row1MinHeight: CGFloat = 50.0@State var row2MinHeight: CGFloat = 50.0@State var row3MinHeight: CGFloat = 50.0@State var row1MaxHeight: CGFloat = 50.0@State var row2MaxHeight: CGFloat = 50.0@State var row3MaxHeight: CGFloat = 50.0let columns = 50let rows = 3var body: some View {VStack {SteppersView(control1A: ("Row 1 Min Height", $row1MinHeight),control1B: ("Row 1 Max Height", $row1MaxHeight),control2A: ("Row 2 Min Height", $row2MinHeight),control2B: ("Row 2 Max Height", $row2MaxHeight),control3A: ("Row 3 Min Height", $row3MinHeight),control3B: ("Row 3 Max Height", $row3MaxHeight))ScrollView(.horizontal) {LazyHGrid(rows: [GridItem(.flexible(minimum: row1MinHeight, maximum: row1MaxHeight)),GridItem(.flexible(minimum: row2MinHeight, maximum: row2MaxHeight)),GridItem(.flexible(minimum: row3MinHeight, maximum: row3MaxHeight))], alignment: .center, spacing: 19) {ForEach(0..<(columns * rows), id: \.self) {index inRectangle().foregroundColor(.red).frame(width: 25)}}}.frame(maxHeight: .infinity).padding(.vertical)Spacer()}} }

GridItem(2.0中的新增功能) (GridItem (New in 2.0))

Back to contents ↑

返回目錄↑

You can see some great examples of GridItem in action above, in LazyHGrid and LazyVGrid.

您可以在上面的LazyHGrid和LazyVGrid看到一些出色的GridItem示例。

A GridItem must be given a size, but spacing and alignment are optional.

必須給GridItem指定大小,但是間距和對齊方式是可選的。

The GridItem.Size enum has three cases:

GridItem.Size枚舉有以下三種情況:

  • case adaptive(minimum: CGFloat, maximum: CGFloat)

    case adaptive(minimum: CGFloat, maximum: CGFloat)

  • case fixed(CGFloat)

    case fixed(CGFloat)

  • case flexible(minimum: CGFloat, maximum: CGFloat)

    case flexible(minimum: CGFloat, maximum: CGFloat)

Bear in mind that failing to give a value for the spacing property allows your columns (in LazyVGrid) or your rows (in LazyHGrid) to potentially end up touching one another if they are not given enough space.

請記住,如果不給LazyVGrid屬性指定值,則如果沒有足夠的空間,則您的列(在LazyVGrid )或行(在LazyHGrid )可能最終彼此接觸。

Being explicit about spacing gives you more control about how you want them to adapt, assuming that the size they were given was not of type .fixed.

明確指定間距可以讓您更好地控制它們的適應方式,假設給出的尺寸不是.fixed類型。

列表(在2.0中更新) (List (Updated in 2.0))

Back to contents ↑

返回目錄↑

List, the vertical ScrollView that allows lazy loading of content only when it is visible on the screen, has some new initialisers in 2.0.

List是一種垂直ScrollView ,僅在屏幕上可見時才允許延遲加載內容,它在2.0中具有一些新的初始化程序。

  • init<Data, RowContent>(Data, children: KeyPath<Data.Element, Data?>, selection: Binding<SelectionValue?>?, rowContent: (Data.Element) -> RowContent)

    init<Data, RowContent>(Data, children: KeyPath<Data.Element, Data?>, selection: Binding<SelectionValue?>?, rowContent: (Data.Element) -> RowContent)

  • init<Data, RowContent>(Data, children: KeyPath<Data.Element, Data?>, selection: Binding<Set<SelectionValue>>?, rowContent: (Data.Element) -> RowContent)

    init<Data, RowContent>(Data, children: KeyPath<Data.Element, Data?>, selection: Binding<Set<SelectionValue>>?, rowContent: (Data.Element) -> RowContent)

  • init<Data, ID, RowContent>(Data, id: KeyPath<Data.Element, ID>, children: KeyPath<Data.Element, Data?>, selection: Binding<Set<SelectionValue>>?, rowContent: (Data.Element) -> RowContent)

    init<Data, ID, RowContent>(Data, id: KeyPath<Data.Element, ID>, children: KeyPath<Data.Element, Data?>, selection: Binding<Set<SelectionValue>>?, rowContent: (Data.Element) -> RowContent)

  • init<Data, ID, RowContent>(Data, id: KeyPath<Data.Element, ID>, children: KeyPath<Data.Element, Data?>, selection: Binding<SelectionValue?>?, rowContent: (Data.Element) -> RowContent)

    init<Data, ID, RowContent>(Data, id: KeyPath<Data.Element, ID>, children: KeyPath<Data.Element, Data?>, selection: Binding<SelectionValue?>?, rowContent: (Data.Element) -> RowContent)

These initialisers all have one thing in common. They were all available when SwiftUI launched, but they were only available on tvOS and watchOS.

這些初始化程序有一個共同點。 它們在SwiftUI啟動時都可用,但是僅在tvOS和watchOS上可用。

All of these initialisers have now been added iOS, macOS and Mac Catalyst.

所有這些初始化程序現已添加到iOS,macOS和Mac Catalyst。

ForEach和DynamicViewContent(在2.0中更新) (ForEach & DynamicViewContent (Updated in 2.0))

Back to contents ↑

返回目錄↑

In the “Views and Controls” chapter of this documentation, I talked about the new UTType structure that had replaced a rather confusing method. Instead of being able to create objects that represent data types, we had to resort to passing an array of strings that represented data types.

在本文檔的“ 視圖和控件 ”一章中,我談到了新的UTType結構,該結構已替代了一個相當混亂的方法。 除了能夠創建代表數據類型的對象外,我們不得不訴諸于傳遞代表數據類型的字符串數組。

This is not obvious in the initialiser for ForEach, but it conforms to the DynamicViewContent protocol. This happens when the generic Content conforms to View, which confusingly isn’t required by the ForEach structure itself. Every initialiser exists in an extension that does require that Content conforms to View though, so don’t go thinking you can use ForEach for any other purpose.

這在ForEach的初始化程序中并不明顯,但它符合DynamicViewContent協議。 當通用Content符合View ,就會發生這種情況,而ForEach結構本身并不需要混淆性的要求。 每個擴展程序都存在于一個擴展中,該擴展確實要求Content符合View ,所以不要以為您可以將ForEach用于任何其他目的。

DynamicViewContent requires a Collection of data, the particular type of which is inferred by the data that it is given. What does it do, you ask. It provides methods such as onDelete, which gives you the ability to run a closure when the user deletes a row of a List. While onDelete hasn’t changed since last year, onInsert has. This occurs when an item is dragged using the onDrag modifier, as List uses onInsert instead of the more conventional onDrop modifier.

DynamicViewContent需要數據Collection ,其特定類型由給出的數據推斷。 您會問,它是做什么的。 它提供了諸如onDelete方法,該方法使您能夠在用戶刪除List的一行時運行閉包。 雖然onDelete還沒有從去年開始改變, onInsert了。 當使用onDrag修改器拖動項目時會發生這種情況,因為List使用onInsert而不是更常規的onDrop修改器。

More information on drag and drop was contained in the “Views and Controls” chapter, so the main thing to point out is that onInsert now takes a UTType structure instead of the previous array of strings representing the UTTypes. This allows us to specify what kind of data can be dragged and dropped into a List, as otherwise we would not know whether we can add that data to the underlying Collection or not.

有關拖放的更多信息包含在“視圖和控件”一章中,因此主要要指出的是, onInsert現在采用UTType結構,而不是之前的表示UTType的字符串數組。 這使我們可以指定可以將哪種數據拖放到List ,否則我們將不知道是否可以將該數據添加到基礎Collection 。

But that’s not all that’s changed.

但這還不是全部更改。

If you look at the new initialiser for ForEach, you might notice something is different:

如果您查看ForEach的新初始化程序,您可能會發現有所不同:

init(_ data: Data, id: KeyPath<Data.Element, ID>, @ViewBuilder content: @escaping (Data.Element) -> Content)

Like the body: some View property of a View struct, the initialiser now takes a @ViewBuilder closure. Why does this matter? This is is effectively like wrapping our layout in a Group in the first iteration of SwiftUI. We did this because we wanted to be able to return one concrete type that conforms to the view protocol, and adding multiple values in the closure made it impossible to do that.

就像body: some View View結構的body: some View屬性一樣,初始化程序現在使用@ViewBuilder閉包。 為什么這么重要? 這實際上就像在SwiftUI的第一次迭代中將布局包裝在Group中一樣。 之所以這樣做,是因為我們希望能夠返回一種符合視圖協議的具體類型,并且在閉包中添加多個值使其無法實現。

Now you can add whatever you want inside a ForEach, as long as it is less than ten views in size.

現在,您可以在ForEach添加所需的任何內容,只要它的大小小于十個視圖即可。

Obviously this excludes the underlying data, so you could for instance have a List row with ten views in it, but that row is one of 100 or more rows that get their data from an array or other data structure.

顯然,這不包括基礎數據,因此,例如,您可以有一個包含十個視圖的List行,但是該行是從數組或其他數據結構獲取其數據的100個或更多行中的一個。

The power of ForEach is the ability to effectively treat as many items as you want as if they were one view in your hierarchy.

ForEach是能夠有效地處理ForEach數量的項目,就好像它們是層次結構中的一個視圖一樣。

ScrollViewReader(2.0中的新增功能) (ScrollViewReader (New in 2.0))

Back to contents ↑

返回目錄↑

There is some similarity between the existing GeometryReader and the new ScrollViewReader.

現有的GeometryReader與新的ScrollViewReader之間存在一些相似之處。

They are both closures that pass in a single parameter.

它們都是傳遞單個參數的閉包。

A GeometryReader passes a GeometryProxy which has two properties: safeAreaInsets: EdgeInsets and size: CGSize. This proxy comes with a method that will return a CGRect for the frame, but it requires a coordinate space in which to calculate this frame. The most obvious one is .global, as this gives a frame that is relative to the entire screen. But you can create custom coordinateSpace with a name that you specify, allowing you to get a frame relative to another View in the hierarchy.

一個GeometryReader傳遞一個GeometryProxy ,它具有兩個屬性: safeAreaInsets: EdgeInsets和size: CGSize 。 該代理附帶有一種方法,該方法將為框架返回CGRect ,但是它需要一個坐標空間來計算該框架。 最明顯的是.global ,因為它提供了相對于整個屏幕的框架。 但是你可以創建自定義 coordinateSpace 與您指定的名稱 ,讓您獲得相對于層次結構中的另一個View的框架。

ScrollViewProxy has no properties, but it has a single method that performs an action instead of returning a value. When we specify an id for Views in a ScrollView, we can provide any Hashable type. With this we are telling Swift which part of our type is unique so that it can differentiate between instances of that type.

ScrollViewProxy沒有屬性,但它具有執行操作而不是返回值的單個方法。 當我們在ScrollView為Views指定一個id ,我們可以提供任何Hashable類型。 這樣我們告訴Swift我們類型的哪一部分是唯一的,以便可以區分該類型的實例。

In my example, I’m just using the index for each row in my List as an ID.

在我的示例中,我只是將List每一行的索引用作ID。

Many provided Swift types already conform to Hashable, so this is easier than making a Hashable type yourself. Here’s how to conform to the Hashable protocol if you’re interested, and you’ll see there that it isn’t a lot of effort at all. Now that I can identify the rows of my List, I provided a TextField that you can type a number into and a Button that will send the ScrollView to that row automatically.

許多提供的Swift類型已經符合Hashable,因此這比自己制作Hashable類型要容易。 如果您感興趣的話,這里是如何遵循Hashable協議的方法 ,您會發現它根本不需要花費很多精力。 現在,我可以識別List的行了,我提供了一個TextField可以在其中鍵入數字)和一個Button ,它將ScrollView自動發送到該行。

struct Contentview: View {@State var target = 0var body: some View {ScrollViewReader { proxy inVStack {Group {Text("Type a number using lower case words like 'thirty-four' and press return on the keyboard")HStack {TargetTextField(target: $target)GoToButton(target: target, proxy: proxy)}}.padding()List {ForEach(0..<100, id: \.self) {index inText("Item \(index)").id(index)}Button("Back to top") {proxy.scrollTo(0)}}}}} }struct GoToButton: View {let target: Intlet proxy: ScrollViewProxyvar body: some View {Button("Go to \(target)") {UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)withAnimation {proxy.scrollTo(target)}}.padding().background(Color.blue).foregroundColor(.white).cornerRadius(15)} }struct TargetTextField: View {static var formatter: NumberFormatter {let formatter = NumberFormatter()formatter.numberStyle = .spellOutreturn formatter}@Binding var target: Intvar body: some View {TextField("Enter a number", value: $target, formatter: Self.formatter).padding().background(Color.gray).cornerRadius(15)} }

I’ve made my example more difficult to use by using a NumberFormatter which uses a numberStyle called spellOut. This requires you to spell your numbers as lowercase words, putting a hyphen between a number like thirty-four and omitting words like and. Have a play around with it, and if you get bored of it, you can always change the NumberFormatter to something more sensible if you prefer.

我做了我的例子比較難用用NumberFormatter其采用了numberStyle稱為spellOut 。 這需要你拼出你的號碼為小寫的話,把一個連字符數量之間像34和省略的話就像和 。 試一試,如果您對它感到厭煩,可以隨時將NumberFormatter更改為更明智的選擇。

Notice that the scrolling is animated, but at the bottom of the List there is a Button that says “Back to top.” Unlike the GoToButton at the top, which puts its proxy.scrollTo(_:) inside a withAnimation block, this Button does not add an explicit animation. This is the default behaviour of the scrollTo(_:) action, instantly scrolling without any animation. Keep this in mind if you want to animate any changes to the scroll location.

請注意,滾動是動畫的,但是在List的底部有一個按鈕,顯示“返回頁首”。 與頂部的GoToButton不同,該Button將其proxy.scrollTo(_:)放在withAnimation塊內,此Button不會添加顯式動畫。 這是scrollTo(_:)操作的默認行為,無需任何動畫即可立即滾動。 如果要對滾動位置進行動畫處理,請記住這一點。

Notice how I was able to pass the ScrollViewProxy as a parameter to GoToButton, so that the ability to change the scroll location can be passed between views.

請注意,我如何能夠將ScrollViewProxy作為參數傳遞給GoToButton ,以便可以在視圖之間傳遞更改滾動位置的功能。

ScrollViewProxy(2.0中的新增功能) (ScrollViewProxy (New in 2.0))

Back to contents ↑

返回目錄↑

See ScrollViewReader above, which passes a ScrollViewProxy as a parameter into its closure the same way as GeometryReader passes a GeometryProxy.

參見上面的ScrollViewReader ,它將ScrollViewProxy作為參數傳遞到它的閉包中,就像GeometryReader傳遞GeometryProxy 。

組(在2.0中更新) (Group (Updated in 2.0))

Back to contents ↑

返回目錄↑

Now that more structures take a @ViewBuilder closure, and therefore return a TupleView that contains up to ten children that all conform to View, you might think that Group no longer has much purpose.

現在,更多結構采用@ViewBuilder閉包,并因此返回一個TupleView ,其中包含最多十個都符合View的子級,您可能會認為Group不再具有太大的用途。

After all this “affordance for grouping view content,” as Apple calls it, did little else at that point.

就像蘋果公司所說的那樣,在完成了所有“為視圖內容分組后的功能”之后,其他事情就沒有了。

But now we have new possibilities, as we can now group anything conforming to these protocols too:

但是現在有了新的可能性,因為我們現在也可以將符合這些協議的所有內容歸為一組:

  • Scene

    Scene

  • Widget

    Widget

  • Commands

    Commands

  • ToolbarContent

    ToolbarContent

I’ll go into a lot more detail about what these are in a later chapter called “App Structure and Behavior,” but the important thing to know is that Group has new capabilities.

在后面的“應用程序結構和行為”一章中,我將詳細介紹這些內容,但重要的是要知道Group具有新功能。

In much the same way that @ViewBuilder allows Group to combine up to ten views, @_WidgetBuilder allows a combination of up to ten widgets. When macOS has commands that it will display in the menus at the top of the screen, up to ten can be added with @CommandBuilder.

@ViewBuilder允許Group最多組合十個視圖,而@_WidgetBuilder可以組合十個小部件。 當macOS具有將顯示在屏幕頂部菜單中的命令時, @CommandBuilder最多可以添加@CommandBuilder 。

Building a toolbar?

建立工具列?

You guessed it:@ToolbarBuilder will allow up to ten children.

您猜對了: @ToolbarBuilder最多允許十個孩子。

Now that SwiftUI apps can be created without an AppDelegate, we use a structure that conforms to the App protocol, which in turn requires a body that conforms to the Scene protocol.

現在,無需使用AppDelegate即可創建SwiftUI應用程序,我們使用符合App協議的結構,而該結構又需要符合Scene協議的主體。

When multiple scenes are provided within a Group, @SceneBuilder allows us to add up to ten children.

當一個Group中提供多個場景時, @SceneBuilder允許我們最多添加十個孩子。

This differs from WindowGroup, which specifically provides views that will be given identically structured yet separate windows. Since WindowGroup conforms to the Scene protocol itself, it can be at the top of the hierarchy inside the body of an App structure. If a Group only has children that conform to the View protocol, it cannot be used in the same way.

這不同于WindowGroup ,后者專門提供了視圖,這些視圖將具有相同的結構,但具有獨立的窗口。 由于WindowGroup符合Scene協議本身,因此它可以位于App結構主體內部的層次結構的頂部。 如果Group僅具有符合View協議的子級,則不能以相同的方式使用它。

In other words, a structure conforming to App can contain:

換句話說,符合App的結構可以包含:

  • A Group made up of up to tenWindowGroup children

    一Group由多達十WindowGroup兒童

  • A group made up of up to ten Scene-conforming children

    由最多十個符合Scene孩子組成的小組

  • A WindowGroup made up of up to ten Group- or other View-conforming children

    一個WindowGroup由最多十個符合WindowGroup或其他符合View的子項組成

If this is confusing, don’t worry. It’ll be covered in way more detail in the “App Structure and Behavior” chapter.

如果這令人困惑,請不要擔心。 “應用程序的結構和行為”一章將對此進行更詳細的介紹。

Groupbox,OutlineGroup和DisclosureGroup (Groupbox, OutlineGroup, & DisclosureGroup)

Of these three, GroupBox is the only one that isn’t new in 2.0.

在這三個組件中, GroupBox是2.0版中唯一不新增的組件。

When Groupbox was made available when SwiftUI was originally released, it was only available on macOS, and the main change is that it is now cross-platform. This is an easy way of grouping content together with an optional label. OutlineGroup provides an ability to reveal additional information about an item that would otherwise be hidden. DisclosureGroup has a similar purpose, with the addition of a Binding<Bool> that can control whether or not the additional information is shown.

在最初發布Groupbox時使Groupbox可用時,它僅在macOS上可用,主要的變化是現在它是跨平臺的。 這是將內容與可選標簽一起分組的一種簡便方法。 OutlineGroup提供了顯示有關可能會隱藏的項目的其他信息的功能。 DisclosureGroup具有類似的目的,增加了一個Binding<Bool> ,它可以控制是否顯示其他信息。

You can find examples of this, as well as the new OutlineGroup and DisclosureGroup, in “SwiftUI’s GroupBox, OutlineGroup, and DisclosureGroup in iOS 14” by Anupam Chugh.

您可以在 Anupam Chugh 撰寫的 “ iOS 14中的SwiftUI的GroupBox,OutlineGroup和DisclosureGroup中 ”找到此示例以及新的OutlineGroup和DisclosureGroup 。

NavigationView(在2.0中更新) (NavigationView (Updated in 2.0))

Back to contents ↑

返回目錄↑

I thought this was already available on watchOS, as I had previously released a watchOS app that lets you choose pictures of dogs from a List. But it turns out that despite using a NavigationLink in that app, I was not embedding it inside a NavigationView. This would compile for iOS and macOS, but it would not allow navigation due to the lack of NavigationView. Presumably something about the way watchOS always works on the basis of stacked navigation makes this unnecessary, but other platforms have no expectation that this would be the case.

我以為它已經在watchOS上可用了,因為我以前發布了一個watchOS應用程序,可以從List選擇狗的圖片。 但事實證明,盡管在該應用程序中使用了NavigationLink ,但我并未將其嵌入到NavigationView 。 這將針對iOS和macOS進行編譯,但由于缺少NavigationView ,因此將不允許導航。 可能有關watchOS始終基于堆疊導航的工作方式的某些事情使此操作變得不必要,但是其他平臺并不期望會出現這種情況。

WatchOS now has the ability to use .navigationViewStyle, but it seems the only provided value for it is StackNavigationViewStyle.

WatchOS現在可以使用.navigationViewStyle ,但是似乎唯一提供的值是StackNavigationViewStyle 。

The only other option on any platform isDoubleColumnNavigationViewStyle, and you can bet that's not coming to WatchOS any time soon!

在任何平臺上,唯一的其他選項是DoubleColumnNavigationViewStyle ,您可以打賭,很快就不會在WatchOS上使用它了!

TabView(在2.0中更新) (TabView (Updated in 2.0))

Back to contents ↑

返回目錄↑

I already mentioned this when I went through the new standard View Modifiers in the “Views and Controls” chapter. That was when I was covering the .tabItem modifier, which has changed in the same way as the TabView it applies to.

我在“ 視圖和控件 ”一章中通過新的標準視圖修改器時已經提到了這一點。 那是我討論.tabItem修飾符的時候,該修飾符的更改方式與其應用于的TabView相同。

To recap what I said then, I’ll post Apple’s example with the addition of the @available attribute at the top.

回顧一下我剛才講的內容,我將在頂部添加@available屬性的情況下發布Apple的示例。

@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 7.0, *) struct TabItem: View {var body: some View {TabView {View1().tabItem {Image(systemName: "list.dash")Text("Menu")}View2().tabItem {Image(systemName: "square.and.pencil")Text("Order")}}} }struct View1: View {var body: some View {Text("View 1")} }struct View2: View {var body: some View {Text("View 2")} }

Notice anything?

注意到什么了嗎?

TabView, along with the modifier .tabItem that allows you to create the icon that represents that page on the tab bar, is new to watchOS. Although it was available on Mac, iOS, iPadOS and tvOS last year, it has only just come to the watch this year. What form could it possibly take, you might ask? It resembles a UIPageViewController from UIKit, with each page requiring you to swipe horizontally from one to the other. The although the .tabItem modifier exists, neither the Text nor the Image that Apple’s example provides are visible.

TabView和修改器.tabItem一起使您可以在選項卡欄上創建代表該頁面的圖標,這是watchOS的新增功能。 盡管它去年在Mac,iOS,iPadOS和tvOS上可用,但今年才出現。 您可能會問,它可能采用什么形式? 它類似于UIKit中的UIPageViewController ,每個頁面都需要您從一個頁面水平滑動到另一個頁面。 盡管存在.tabItem修飾符,但Apple示例提供的Text和Image都不可見。

Instead we get dots, much in the same way that UIPageViewController makes use of a UIPageControl, which Apple describes as "a horizontal series of dots, each of which corresponds to a page in the app’s document or other data-model entity.”

相反,我們得到點,就像UIPageViewController使用UIPageControl ,Apple將其描述為“水平的點序列,每個點對應于應用程序文檔或其他數據模型實體中的頁面”。

下一步 (Next Steps)

SwiftUI is only a year old as I’m writing this, and there are already a wealth of resources out there. My writing would not be possible without the following websites:

在我撰寫本文時,SwiftUI才剛成立一年,并且那里已經有很多資源。 沒有以下網站,我的寫作將是不可能的:

  • LOSTMOA Blog

    LOSTMOA博客

  • Hacking with Swift

    用Swift入侵

  • Swift UI Lab

    Swift UI實驗室

  • Swift with Majid

    斯威夫特與馬吉德

  • WWDC by Sundell

    WWDC,桑德爾

  • Swift by Sundell

    迅捷的桑德爾

If you’ve got a great resource to share with the community, let me know and I’ll gladly add it to this list.

如果您有很多資源可以與社區分享,請告訴我,我們很樂意將其添加到此列表中。

As I said at the start of the article, If you have requests for more detail on a subject, or if you think I’ve made a mistake, let me know in a response below.

就像我在文章開頭所說的那樣,如果您要求提供有關某個主題的更多詳細信息,或者您認為自己犯了一個錯誤,請在下面的回復中告訴我。

Thanks for reading!

謝謝閱讀!

翻譯自: https://medium.com/better-programming/view-layout-and-presentation-in-swiftui-705b7d81f03

swift和swiftui

總結

以上是生活随笔為你收集整理的swift和swiftui_在swiftui中查看布局和演示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

中文在线中文资源 | 五月天高清欧美mv | 亚洲欧美日韩国产一区二区三区 | 精品亚洲免a | 免费欧美 | 中文字幕精品www乱入免费视频 | 不卡电影一区二区三区 | 天天干夜夜干 | 国产精品尤物视频 | 97碰碰精品嫩模在线播放 | 色97在线 | 又黄又爽又湿又无遮挡的在线视频 | 欧美大片在线观看一区 | 国产一区二区精 | 97视频亚洲| 日日干天天插 | 在线观看国产一区二区 | 国产精品一级在线 | 日日躁你夜夜躁你av蜜 | 日日干,天天干 | 亚洲欧美视频在线观看 | 成人午夜av电影 | 超碰在线个人 | 91精品国自产在线偷拍蜜桃 | 91漂亮少妇露脸在线播放 | 亚洲美女在线一区 | 国产成人精品在线观看 | 免费黄色在线播放 | www国产亚洲精品久久网站 | 天天操夜操 | 999久久久久久久久 69av视频在线观看 | 在线日本看片免费人成视久网 | 精品久久久久一区二区国产 | 在线观看一区二区视频 | 91欧美国产 | 成人午夜精品久久久久久久3d | 国产精品s色 | 激情六月婷婷久久 | 丁香婷婷深情五月亚洲 | 激情视频亚洲 | 国产精品久久久久久久久久久久久久 | 91在线在线观看 | 久久精品首页 | 日日日网 | 丁香在线视频 | 亚洲日本在线一区 | 日韩av成人免费看 | 激情视频免费观看 | 国产视频一区二区在线观看 | 久久96国产精品久久99漫画 | 亚洲精品乱码久久久久久高潮 | 免费视频你懂得 | 91久久久久久久一区二区 | 在线成人高清电影 | www·22com天天操 | 91久久爱热色涩涩 | 婷婷综合av | 国产成人一区二区三区在线观看 | 一二三久久久 | 在线亚洲欧美日韩 | 日韩欧美一区二区在线播放 | 99在线视频网站 | 色婷婷免费视频 | 亚洲va男人天堂 | 欧美日本国产在线观看 | 久久久天天操 | 九九热久久免费视频 | 在线小视频你懂得 | 日韩欧美成人网 | 精品一区 在线 | 黄色国产成人 | 精品久久一区二区三区 | 麻豆国产精品va在线观看不卡 | 免费av 在线 | 婷婷丁香狠狠爱 | 亚洲精品视频二区 | 99精品欧美一区二区蜜桃免费 | www.干| 9色在线视频 | 五月婷婷在线播放 | 最新日本中文字幕 | 不卡av电影在线观看 | 日本三级人妇 | 亚洲激情在线观看 | 激情动态| 免费一级片观看 | 四虎在线视频免费观看 | 国产在线观看你懂得 | 最近中文字幕高清字幕在线视频 | 最近字幕在线观看第一季 | 日日夜夜天天综合 | 天天操夜操| va视频在线 | 韩国在线视频一区 | 午夜av免费在线观看 | 西西444www大胆无视频 | 天天草天天草 | 人人爱人人舔 | 蜜臀久久99精品久久久久久网站 | 五月综合激情网 | 久久久久国产a免费观看rela | 亚洲成人免费观看 | 国产精品九九九九九九 | 99久久99热这里只有精品 | 国产专区精品视频 | 国产在线观看免费av | 激情久久伊人 | 精品成人网 | 美女视频黄免费的 | 国产日韩欧美在线观看视频 | 日本韩国在线不卡 | 亚洲精品高清视频在线观看 | 国产一区免费观看 | av网站地址| 福利一区在线 | 亚洲精品国产视频 | 国产乱视频 | 久草视频网 | 99激情网 | jizz欧美性9 国产一区高清在线观看 | 亚洲国产精品女人久久久 | 免费看片日韩 | 麻豆久久| 婷婷丁香导航 | 超碰com | 国产精品久久久久久久久久直播 | 日韩手机视频 | 粉嫩aⅴ一区二区三区 | 成人av免费看 | 四虎在线免费 | 9久久精品| 色综合中文字幕 | 欧美一级黄色视屏 | 国产日韩中文字幕 | av福利免费| 久久网址 | 国产黄大片在线观看 | 成人一级| 免费在线日韩 | 91人人揉日日捏人人看 | 91在线免费播放视频 | 成人黄色在线 | 国产一区二区高清视频 | 一区精品在线 | 日韩理论在线 | 在线精品观看国产 | 久久精品一二三区 | 中文字幕丝袜美腿 | 亚洲成人频道 | 亚洲天天综合 | 中文av在线天堂 | 综合久久久久 | 不卡视频国产 | 91视频最新网址 | 欧美va日韩va| 久久精品波多野结衣 | 午夜精品一区二区三区免费 | 成人动漫一区二区三区 | 日韩高清在线观看 | 黄网站免费看 | 日黄网站 | 天天操天天舔天天爽 | 国产精品自产拍在线观看 | 最新不卡av | 97精品国产97久久久久久春色 | av日韩精品| 国产麻豆成人传媒免费观看 | 久久涩涩网站 | 国产网站在线免费观看 | 亚洲 在线 | www.99热精品 | 久久视频免费在线观看 | 又色又爽又黄高潮的免费视频 | 黄色小视频在线观看免费 | 国产精品久久在线 | 久久国产网 | 不卡的一区二区三区 | 中文免费观看 | 最近中文字幕大全中文字幕免费 | 国产手机精品视频 | 免费在线国产精品 | 日韩在线观看一区 | 久草在线视频看看 | 久久另类小说 | 91女人18片女毛片60分钟 | 国产精品成久久久久 | 黄色影院在线播放 | 深爱婷婷激情 | 国产一区二区三区视频在线 | 中文字幕在线看视频 | 国产精品入口66mio女同 | 91桃色免费视频 | 亚洲精品视频在线观看免费 | 欧美九九九 | 国产在线91在线电影 | 亚洲午夜激情网 | 欧美日韩久久久 | 中文字幕xxxx| 日韩av在线高清 | 中文字幕在线一区二区三区 | 99这里只有精品99 | 一级性av | 亚洲精品资源在线 | 免费看网站在线 | 免费在线观看不卡av | 美女一级毛片视频 | 一区二区精品视频 | 久久久久久久久黄色 | 四虎在线免费观看视频 | 亚洲日本激情 | 精品网站999www | 亚洲综合小说电影qvod | 亚洲成av人影院 | 国产高清在线免费视频 | 日韩视频欧美视频 | 久久成年人 | 中文字幕av专区 | 亚洲综合精品在线 | 中文字幕一区在线 | 久久一线 | 色夜影院 | 丁香六月婷婷开心婷婷网 | 亚洲高清视频在线观看 | 午夜精品婷婷 | 欧美男同视频网站 | 天天鲁天天干天天射 | 婷婷久久丁香 | 成年人免费在线观看网站 | 亚洲一级国产 | 日韩性xxx| 日韩在线网址 | 国产精品一区二区三区在线看 | 黄色在线看网站 | 九九国产精品视频 | 婷婷在线精品视频 | 国产精品va最新国产精品视频 | 插久久 | 国产精品久久久久9999吃药 | 国产视频每日更新 | 欧美性色综合网站 | 婷婷视频在线 | 精品一区二区三区电影 | 天天想夜夜操 | 亚洲国产精彩中文乱码av | 2019av在线视频 | 狠狠狠狠狠狠狠狠干 | 69国产在线观看 | 免费观看全黄做爰大片国产 | 欧美性另类| 91丨九色丨蝌蚪丨老版 | 久久综合中文字幕 | 天天干天天射天天爽 | 欧美性久久久 | 日本少妇高清做爰视频 | 婷婷激情影院 | 久久久久久久久久久综合 | 九七人人干 | 大片网站久久 | 久草视频在 | 国产精品区二区三区日本 | 美女网色 | 99久久99久久精品国产片果冰 | 天天做天天干 | 亚洲一区精品二人人爽久久 | 日韩在线视频看看 | 最新的av网站 | 99久热在线精品视频 | 亚洲成人动漫在线观看 | 亚洲在线视频播放 | 日日婷婷夜日日天干 | 久久久黄视频 | 91麻豆精品国产自产 | 日韩在线一二三区 | 国产一区 在线播放 | 国产精品视频免费看 | a在线播放 | 99视频精品全国免费 | 亚洲精品久久久久久中文传媒 | 国产成人久久av977小说 | 91香蕉视频色版 | 一区二区三区在线观看 | 日本黄色大片免费看 | 国产精品久久久av | 一级成人在线 | 久草视频国产 | 亚洲成人精品 | 国产一区二区在线精品 | 国产高清在线不卡 | 国产成人av福利 | 欧美 国产 视频 | 天天天干天天天操 | 91综合视频在线观看 | 在线亚洲日本 | av综合av| 日本中文字幕网站 | 天天天天干 | 久久99在线 | 日韩在线高清视频 | 久久99免费观看 | 天天干天天拍天天操天天拍 | 欧美色图88 | 国产在线精品一区 | 中文字幕在线观看日本 | 中文字幕资源网在线观看 | 国产高清黄色 | 大型av综合网站 | 国产香蕉久久精品综合网 | av黄色免费网站 | 中文字幕一区二 | 免费看黄在线网站 | 久久久久综合精品福利啪啪 | 亚洲午夜精品久久久久久久久 | 精品日韩在线 | 美女视频黄免费 | 国产正在播放 | 亚洲激情在线观看 | 九九热久久久 | 99久久日韩精品视频免费在线观看 | 中文字幕在线不卡国产视频 | 成人小视频在线观看免费 | 91亚洲精品在线 | 亚洲精品在线观看视频 | 国产精品亚 | 欧美国产日韩在线视频 | 麻豆视频一区二区 | 91最新地址永久入口 | 色片网站在线观看 | 日韩在线网址 | 高清不卡一区二区三区 | 久久精品国产第一区二区三区 | 99久久这里有精品 | 日本大尺码专区mv | 精品免费观看 | av免费电影网站 | 中文字幕字幕中文 | 高潮久久久久久久久 | 久久精品国产免费看久久精品 | 亚洲 欧美 变态 国产 另类 | 日韩啪啪小视频 | free. 性欧美.com| 国产精品3 | 欧美在线视频免费 | 亚洲在线观看av | 国产又粗又硬又长又爽的视频 | 亚洲国产精品va在线看黑人动漫 | 欧美精品久久久久 | 亚洲精品久久久久久久不卡四虎 | 久草在线视频在线观看 | 成人动漫一区二区三区 | bbbbb女女女女女bbbbb国产 | 91香蕉视频720p| av免费成人 | 久久香蕉国产 | 久草网首页| 亚洲精品国精品久久99热 | 在线观看精品视频 | 99r国产精品 | av中文字幕网址 | 亚洲一级片在线看 | 91av电影在线观看 | 亚洲黄色在线免费观看 | 涩涩资源网 | 2022中文字幕在线观看 | 日韩毛片在线一区二区毛片 | 久久不卡国产精品一区二区 | 亚洲国产中文在线观看 | 欧美 日韩精品 | 亚洲人成网站精品片在线观看 | 国产亚洲视频中文字幕视频 | 久久久久亚洲精品 | 在线看中文字幕 | 久久艹久久 | 色网站免费在线看 | 久久久久在线观看 | 久久久久久久久免费视频 | 国产主播大尺度精品福利免费 | 91少妇精拍在线播放 | 麻豆网站免费观看 | 久久av福利 | 国产精品黄色 | 中文字幕 国产视频 | 草久在线视频 | 99亚洲精品在线 | 91麻豆精品国产91久久久无限制版 | 超碰资源在线 | 国产精品毛片完整版 | 欧洲精品视频一区二区 | 91免费的视频在线播放 | 免费一级片久久 | 国产成a人亚洲精v品在线观看 | 国产成人精品一区二区三区网站观看 | 91最新国产 | 你操综合 | 91麻豆精品91久久久久同性 | 久久久官网 | 中文字幕亚洲不卡 | 特级西西www44高清大胆图片 | 国内成人精品视频 | 韩国视频一区二区三区 | 狂野欧美激情性xxxx | 久久久久久久久久久久久久av | 黄色av电影一级片 | 国内视频 | 日韩精品一区二区三区中文字幕 | 91在线小视频 | 精品国产亚洲在线 | 日韩久久精品一区二区 | 欧美一级片免费播放 | 日韩一区二区三区视频在线 | 欧美少妇18p | 97国产精品免费 | 久久久黄视频 | 69久久久久久久 | 欧美精品国产精品 | 黄色免费看片网站 | 岛国av在线免费 | 国产精品乱码久久久久 | 美女网站色免费 | 美女网站视频免费都是黄 | 四虎永久精品在线 | 91视频黄色| 亚洲视频综合在线 | 亚洲撸撸 | 99久久精品无码一区二区毛片 | 五月婷婷六月综合 | 中字幕视频在线永久在线观看免费 | 国产不卡高清 | 久草视频国产 | 色五月色开心色婷婷色丁香 | 国产亚洲视频在线 | 不卡精品 | 国产精品免费一区二区 | 日韩午夜av电影 | 五月婷婷黄色 | 亚洲aⅴ久久精品 | 最近中文字幕高清字幕在线视频 | 国产一卡二卡在线 | 四虎天堂 | 久久九九国产视频 | 国产短视频在线播放 | 三级黄色片子 | 日韩精品一区二区三区在线视频 | 四虎8848免费高清在线观看 | 97在线观看免费观看高清 | 久久综合久久综合这里只有精品 | 亚洲精品天天 | 日本天天色 | 日本中文字幕在线观看 | 久久国产精品视频免费看 | 国产福利资源 | 亚州精品国产 | www.99在线观看 | 91精品国产高清自在线观看 | 日韩在线观看视频中文字幕 | 97在线观视频免费观看 | 国产亚洲欧美一区 | 欧美亚洲成人xxx | 国产色小视频 | 久久影视一区 | 九色porny真实丨国产18 | 黄色a大片 | 日韩精品一区电影 | 国产精品9区 | 91成人精品一区在线播放 | 91爱在线 | 叶爱av在线 | 精品国产欧美一区二区三区不卡 | 日韩三级中文字幕 | 日韩精品1区2区 | 黄在线| 人人添人人澡人人澡人人人爽 | 成 人 黄 色 视频免费播放 | 亚洲午夜在线视频 | av千婊在线免费观看 | 国产免费av一区二区三区 | 午夜精品久久久久久久99热影院 | 国产精品99久久久久的智能播放 | 91人人干 | 亚洲日本国产精品 | 久久久国产精品人人片99精片欧美一 | 成人在线观看日韩 | 亚洲视频精品在线 | 麻豆高清免费国产一区 | www.久久精品视频 | 久久99国产精品免费 | 91在线播放综合 | 亚洲精品国产精品国产 | 久久久精品 | 在线国产一区二区三区 | 一区二区视频电影在线观看 | 国产在线黄 | 久久婷婷国产色一区二区三区 | 美女久久久 | 日韩精品一区二区三区三炮视频 | 亚洲综合小说电影qvod | 干综合网 | 亚洲精品国产成人 | 热久久这里只有精品 | 91爱爱免费观看 | 91中文字幕视频 | 99久久www| 久久艹欧美 | 在线电影 你懂得 | 天天综合成人网 | 国内99视频 | 欧美黄在线 | 夜夜躁狠狠躁日日躁 | 日本中文字幕电影在线免费观看 | 国模吧一区 | 久草免费新视频 | 狠狠色丁香婷婷综合久小说久 | 国产在线精品一区 | 久久福利精品 | 亚洲精品自在在线观看 | 九九热视频在线播放 | 成人免费一级 | 国产免费黄色 | 国产91精品一区二区麻豆亚洲 | 91福利视频免费观看 | 日韩精品大片 | 国内精品久久久久影院优 | 在线观看国产日韩 | 成人网在线免费视频 | 午夜美女视频 | 99电影456麻豆 | av成人黄色 | 国产精品18久久久久久久网站 | 成人午夜影视 | 视频一区二区三区视频 | 国产精品爽爽久久久久久蜜臀 | 精品九九九 | 亚洲国产精品人久久电影 | 六月丁香婷婷在线 | 亚洲一级二级三级 | 久操操| 久久久99精品免费观看乱色 | 四虎天堂 | 欧美在线一级片 | 日韩免费一区二区 | 国产精品视频一二三 | 亚洲人成人在线 | 欧美ⅹxxxxxx | 黄色小说视频网站 | 国产成人精品综合久久久 | 久久久久国产成人精品亚洲午夜 | 国产97色 | 久久久久免费精品国产小说色大师 | 国内丰满少妇猛烈精品播 | 久久精品a | 操操操日日日干干干 | 日韩精品欧美精品 | 五月综合婷| 国产精品大全 | 九七在线视频 | 国产粉嫩在线 | 91麻豆免费视频 | 亚洲一级国产 | 国产一二三四在线观看视频 | 99久久日韩精品免费热麻豆美女 | 欧美污污网站 | 久久激情五月婷婷 | 婷婷av电影| 午夜av一区二区三区 | 国产精品电影一区二区 | 国产精品 999 | av三区在线 | 欧美日韩有码 | 久久99最新地址 | 免费看十八岁美女 | 天天天天色综合 | 丁香视频 | 欧美二区三区91 | 黄色在线观看www | 五月花丁香婷婷 | 精品久久久久久亚洲综合网 | 又紧又大又爽精品一区二区 | 色94色欧美 | 伊人www22综合色 | 精品视频区 | 亚洲 中文 在线 精品 | 一区在线观看视频 | 天操夜夜操| 日韩一级电影在线观看 | 成人va天堂 | 日本特黄一级 | 日本在线中文在线 | www.天天射| 岛国大片免费视频 | 国产精品99精品 | 国产精品久久久久久久久久久久久久 | 日韩在线免费高清视频 | 国产成人精品一区一区一区 | 91精品久久久久久久久 | 国产区久久 | 天天干天天射天天插 | 五月亚洲 | 国产精品视频久久久 | 久久久av免费 | 国产在线国偷精品产拍免费yy | 色91av | 成年人免费电影 | 另类五月激情 | 天天综合网在线观看 | 色播五月激情五月 | 中文字幕资源网 国产 | 国产亚洲精品免费 | 国产小视频国产精品 | 天天曰天天爽 | 欧美日韩不卡在线视频 | 国产另类av | 中文字幕在线看视频国产 | 九九视频热 | 婷五月天激情 | 日韩成人邪恶影片 | 色婷婷在线观看视频 | 大胆欧美gogo免费视频一二区 | 最近日本韩国中文字幕 | 日本黄色免费大片 | 久久精品这里热有精品 | 激情av网| 久久久久久97三级 | 免费中午字幕无吗 | 天堂网一区二区三区 | 国产一级免费播放 | 日韩视频免费看 | 中文不卡视频 | 一区二区三区免费 | 五月婷婷综合在线 | 免费看日韩片 | 日韩精品综合在线 | 国产黄色美女 | 韩国av电影网 | 久久人人艹 | 97视频免费观看 | 久久一级电影 | 亚洲国产精品久久 | 91av在线免费看 | 夜夜夜夜爽 | 久草久草视频 | 在线免费黄色av | 亚洲日本va中文字幕 | 日韩精品久久久久久久电影竹菊 | 久久夜夜夜 | 国产成人不卡 | a午夜电影 | 五月天色婷婷丁香 | 亚洲精品午夜aaa久久久 | 九色视频自拍 | 亚洲国产精品成人综合 | 免费人成网 | 久久成人综合视频 | 精品久久国产 | 天天色天天上天天操 | 成年人在线看视频 | 日韩毛片精品 | 欧美激情精品久久 | 日韩高清免费电影 | 国产免费午夜 | 日韩高清在线一区 | 亚在线播放中文视频 | 99久久日韩精品免费热麻豆美女 | 国产成人一区二区在线观看 | 亚洲成人精品国产 | 成年人在线播放视频 | 国产精品影音先锋 | 久久久国产精品麻豆 | 99热精品国产一区二区在线观看 | 黄色在线视频网址 | 天天av资源 | 中文字幕视频免费观看 | 久久99在线| 日韩精品一区二区免费视频 | 亚洲最新av在线网址 | 日韩在线不卡 | 97人人模人人爽人人喊网 | 免费a级黄色毛片 | 色婷婷亚洲精品 | 日韩久久精品一区二区三区 | 在线国产激情视频 | 99精品国产亚洲 | 中文字幕免费播放 | 国产手机在线观看 | 中文字幕在线观看视频网站 | 国产精品免费视频一区二区 | 91麻豆免费看| 麻豆国产精品一区二区三区 | 91九色网站 | 中文字幕在线视频网站 | 色香com.| 天天干.com | 日韩黄色免费在线观看 | 国产视频综合在线 | 中文字幕在线观看第一区 | 99久久国产免费,99久久国产免费大片 | 天天射天天爽 | 久久久久久久久福利 | 久久久久久久av麻豆果冻 | 天天爽人人爽夜夜爽 | 日韩在线免费看 | 天天干天天搞天天射 | 色综合狠狠干 | av再线观看| 精品国产一区二区三区久久影院 | 国产精品久久久久久999 | 在线免费观看涩涩 | 亚洲激情电影在线 | 国产精品丝袜在线 | 色婷婷激婷婷情综天天 | 国产成人99久久亚洲综合精品 | 2023国产精品自产拍在线观看 | 91在线播放综合 | 亚洲国产精品资源 | 久久露脸国产精品 | 久久不射电影院 | 一区二区在线影院 | 亚洲欧美国内爽妇网 | 一区二区精品久久 | 久久免费精品视频 | 亚洲人成网站精品片在线观看 | 黄色三级免费 | 国产高清专区 | 精品福利在线观看 | av一区二区在线观看中文字幕 | 天天综合在线观看 | 不卡av在线播放 | 欧美-第1页-屁屁影院 | 久久国产一区二区三区 | 国产免费视频一区二区裸体 | 国产高清在线免费视频 | 天天干,夜夜爽 | 国产精品毛片一区二区 | 国产黄色片免费看 | 国产123区在线观看 国产精品麻豆91 | 欧美色综合天天久久综合精品 | 国产高清在线免费 | 国产精品视频最多的网站 | 午夜精品久久久久久99热明星 | www.com操| www.色com| av成人免费在线看 | 久久久久久久网 | 精品久久久久久久久中文字幕 | 国产精品久久二区 | 最近中文字幕在线播放 | 91精品视频在线免费观看 | 久久亚洲综合色 | 色网av | 狠狠色丁香婷综合久久 | 亚洲国产成人精品电影在线观看 | 日韩精品中文字幕久久臀 | 成人免费在线网 | 欧美疯狂性受xxxxx另类 | 久久久久久网站 | 夜色成人网 | 日本资源中文字幕在线 | av高清一区 | 国产涩涩网站 | 国产精品久久久av久久久 | 在线观看视频一区二区三区 | 九色精品 | 欧美91精品久久久久国产性生爱 | 日免费视频| 国产精品一区二区三区电影 | 人人爱人人做人人爽 | 精品乱码一区二区三四区 | 91九色精品女同系列 | 亚洲成人av片 | 夜夜澡人模人人添人人看 | 亚洲国产美女精品久久久久∴ | 亚洲欧美精品在线 | 精品国产欧美 | 亚洲日韩中文字幕 | 天天摸天天舔天天操 | 国产精品女视频 | 久久国产精品久久久久 | 成年人视频免费在线播放 | 国产a网站| 日韩欧美视频免费在线观看 | 成年人视频在线观看免费 | 黄色特一级 | 夜夜骑天天操 | 精品日韩在线一区 | 成人午夜久久 | 日韩a级免费视频 | 日韩成人精品一区二区三区 | 国产精品99久久久久 | 亚洲精品玖玖玖av在线看 | 色综合天天在线 | 色欲综合视频天天天 | 久久伊人色综合 | a级片在线播放 | 久久玖 | 国产精品久久久一区二区 | 午夜国产一区二区 | 精品国产一区二区三区久久久久久 | 人人澡人人添人人爽一区二区 | 国产又粗又猛又色又黄视频 | 九九九九九国产 | 97在线观看免费高清 | 青青河边草免费 | 免费进去里的视频 | 久久99热精品这里久久精品 | 欧美有色 | 日韩亚洲国产中文字幕 | 成人黄色小说网 | 亚洲黄色精品 | 国产香蕉av | 91传媒91久久久 | 欧美a级免费视频 | 激情网站 | 一级免费黄色 | 国产精品成人自产拍在线观看 | 日韩免费电影 | 国产精品对白一区二区三区 | 日韩色高清 | 成人国产精品久久久 | 91精品亚洲影视在线观看 | 337p日本欧洲亚洲大胆裸体艺术 | 亚洲精品在线观看网站 | 中文字幕色在线视频 | 美女免费视频观看网站 | 天天爱天天射 | 免费看片日韩 | 国产高清视频 | 久久手机看片 | 日韩精品不卡在线 | 全久久久久久久久久久电影 | 日韩精品一区二区免费 | 最近2019中文免费高清视频观看www99 | 成人手机在线视频 | 欧美日韩视频在线 | 色综合色综合色综合 | 久久69av | 日韩大片免费观看 | 成人小视频在线免费观看 | 五月天婷婷丁香花 | 亚洲国产精品日韩 | 91日本在线播放 | 99国产精品久久久久久久久久 | 国产精品午夜免费福利视频 | 婷婷综合成人 | 男女视频久久久 | 蜜桃av久久久亚洲精品 | 久久成人国产精品免费软件 | 中文字幕乱码亚洲精品一区 | 日本久久久亚洲精品 | 青草视频在线 | 久久久精品欧美一区二区免费 | 久久国产美女 | 全黄色一级片 | 亚洲国产精品日韩 | 久久艹免费 | 天天做天天爱夜夜爽 | 一区二区三区四区五区在线视频 | 日本在线中文在线 | 精品超碰 | 亚洲网站在线看 | 黄p在线播放 | 国产一区欧美二区 | 亚洲国产中文字幕在线视频综合 | 国产日产高清dvd碟片 | 国内精品久久久久影院一蜜桃 | 国产精品毛片久久久久久久久久99999999 | 一区二区三区中文字幕在线观看 | 国产成人免费观看 | 成人欧美一区二区三区黑人麻豆 | 久久国产精品小视频 | 婷婷丁香自拍 | 国产精品99久久久精品免费观看 | 成片人卡1卡2卡3手机免费看 | 99这里只有久久精品视频 | 在线观看完整版免费 | www.亚洲在线| 国产日本亚洲 | 久久开心激情 | 久久久久国产精品免费网站 | av一区二区三区在线播放 | 奇米影视在线99精品 | 国产精品久久久久久久久久久久冷 | 成人午夜影院 | 国产麻豆精品一区 | 婷婷在线观看视频 | 久久不卡免费视频 | 午夜精品久久久久99热app | 综合网婷婷 | 免费在线播放av电影 | 国产999精品久久久久久绿帽 | 瑞典xxxx性hd极品 | 久久呀| 69av久久 | 亚洲欧美国产日韩在线观看 | 天天插夜夜操 | 精品中文字幕在线播放 | 日韩精品一卡 | 久久精品网站免费观看 | 成年人在线免费看 | 国产成人区 | 97看片 | 私人av | 国产日韩欧美在线免费观看 | 日韩欧在线 | 99爱这里只有精品 | 欧美色黄 | 国产精品美女免费视频 | 国产无套精品久久久久久 | 天天操夜夜操夜夜操 | 婷婷射五月 | 国产精品a级 | 999在线精品 | 欧美日韩久久久 | 国产精品久久久久久久久久了 | av在观看 | 久久天天躁夜夜躁狠狠躁2022 | 日本在线中文在线 | 欧美日韩精品国产 | 国产精品视频永久免费播放 | 日韩高清毛片 | 精品国模一区二区 | 黄色毛片视频免费观看中文 | 色综合天天综合网国产成人网 | 夜色成人网 | 久久激情小说 | 久久久久久久久久久精 | 天天做天天看 | 久久免费视频精品 | www.com.日本一级| 日韩欧美aaa| 97免费 | 欧美aaaxxxx做受视频 | 99精品国产一区二区三区不卡 | 日韩午夜电影院 | 欧美性黑人| 成人a级黄色片 | 色在线免费 | 国产不卡精品 | 成年人在线免费看视频 | 国产999视频在线观看 | 狠狠狠狠狠狠操 | 超碰97在线资源站 | 中文av网站| 成年人在线观看免费视频 | 九九精品在线观看 | 天天操偷偷干 | 精品视频在线视频 | 国产日产欧美在线观看 | 日韩在线观看网址 | 中文字幕亚洲欧美日韩 | 超碰97久久 | 亚洲一级片在线看 | 波多野结衣视频一区二区三区 | 久久大片网站 | 国产在线中文 | 99精品在线视频播放 | 国产精品一区二区三区久久 | 五月天丁香综合 | 日韩欧美视频在线播放 | 黄色a级片在线观看 | 久久黄页| 日韩r级电影在线观看 | 亚洲国产成人精品在线观看 | 99国产视频在线 | 精品久久久久久亚洲综合网站 | 亚洲成色 | 99久久精品免费看 | 麻豆久久精品 | 国产黄色片免费观看 | 欧美精品小视频 | 五月天,com | 美女免费视频黄 | 国产一级不卡视频 | 国产二区电影 | 久久精品国产亚洲 | 伊人婷婷色| 91视频91蝌蚪 | 成年人黄色免费看 | 亚洲电影一区二区 | 久久99国产精品免费网站 | 免费视频久久久久久久 | 成人久久久久 | 天天色棕合合合合合合 | 日韩免费视频在线观看 | 一区二区三区视频 | 久久精品福利视频 | 91亚洲狠狠婷婷综合久久久 | 日本精a在线观看 | 激情网色| 丁香资源影视免费观看 | 久久 一区 | 成人资源在线观看 | 中文字幕一区二区三区在线视频 | 亚洲成人精品 | 久久电影国产免费久久电影 | 国产在线一卡 | 欧美91精品 | 18久久久久| 蜜桃传媒一区二区 | 成人久久 | av性在线|