0926 - iOS之UITableView类

Table Views的介绍(link)

--A table view displays a single column of vertically scrolling content, divided into rows and sections.

   一个tableView用一列来展示多行视图,也可以设置若干行为一节,可以有多节。

Table views are a collaboration between many different objects, including:

 如果你要设计一个table view,那你就需要下面四种东西来组合成你的table view

  • Cells. A cell provides the visual representation for your content. You can use the default cells provided by UIKit or define custom cells to suit the needs of your app.

        单元格概念,每一行用一个cell对象来表征,你可以自定义cell也可以UIKit提供的默认cell。

  • Table view controller. You typically use a UITableViewController(link) object to manage a table view. You can use other view controllers too, but a table view controller is required for some table-related features to work.

        控制器,一般都是用UITableViewController来管理你的table view,可以用其他controller,但UITableViewController更好用一些,因为有一些与table特征必须要用到UITableViewController

  • Your data source object. This object adopts the UITableViewDataSource protocol and provides the data for the table.

        数据对象,你需要一个遵守了UITableViewDataSource协议的数据对象,用于存储数据提供给你的table使用

  • Your delegate object. This object adopts the UITableViewDelegate protocol and manages user interactions with the table's contents.

      代理对象,你需要一个遵守了UITableViewDelegate协议的代理对象来与你的table 里面的内容进行交互,就是与cell进行交互。一般来讲,你直接用自己的controller遵守这个协议也是可以的。

 

UITableView类:

     --A view that presents data using rows arranged in a single column.

     一个在单列里面显示多行内容的视图

UITableView继承于UIScrollView,UIScrollView可以在任意方向滑动,而UITableVIew只能在垂直方向上滑动。

--UITableView manages the basic appearance of the table, but your app provides the cells (UITableViewCell objects) that display the actual content.

     UITableView通过UITableViewCell object来展示每一行的视图,与每一行的数据的。

--For information about how to specify your table’s data, see Filling a Table with Data(link).

    关于更多的填充table数据的信息,看超链接

--Tables are commonly used by apps whose data is highly structured or organized hierarchically.

   表格里面的数据都是高度结构化和层次化的,不然你也不会采用table view来设计啊。

--Apps that contain hierarchical data often use tables in conjunction with a navigation view controller, which facilitates navigation between different levels of the hierarchy.

    通常table view会和navigation view controller一起使用,因为“导航视图控制器”会更加方便 在不同层次的 数据对象 之间导航,就是游走践踏,为所欲为。

--UITableView manages the basic appearance of the table, but your app provides the cells (UITableViewCell objects) that display the actual content.

   UITableView这个类只是提供了基本的外观展示,一般来说,你都需要使用到 cell对象 来美化展示你想要的视觉效果,也就是展示你真正想展示的样子(内容)。cell也提供了基本的样式,你可以使用,也可以自定义,具体看UITableViewCell(link)

--You can also supply header and footer views to provide additional information for groups of cells.

   你也可以为 一组单元格 添加“页眉”和“页脚”视图,这样你就可以把额外的信息放在页头页脚里面了。

--Table views are data driven, normally getting their data from a data source object that you provide.

   table view时基于数据驱动的,所以你要提供 数据对象 来被table view拿数据。

--The data source object manages your app’s data and is responsible for creating and configuring the table’s cells.

   数据对象,负责管理你的app的数据,也是它创建和配置cell的。参考链接: Filling a Table with Data(link).

--To save and restore the table’s data, assign a nonempty value to the table view’s restorationIdentifier property.

   table view 支持状态的保存,你可以通过赋值给restorationIdentifier属性,然后下次访问的时候,就可以看到以前的状态了。更多详情,参考链接:Preserving Your App's UI Across Launches(link).也可为每个数据对象赋予ID,自己看。

 

UITableView的使用总结:

     其实,基本上都是直接操作 UITableViewCell 对象 的了。

     首先大概看一下UITableViewDelegate协议和UITableViewDataSource协议的作用范围。

UITableViewDelegate:

--Methods for managing selections, configuring section headers and footers, deleting and reordering cells, and performing other actions in a table view.

    也就是说这个协议,主要定义了选择事件、配置页眉页脚、增删单元格、单元格排序、还有执行table上的一些动作事件 的方法,主要是用于处理响应事件和宏观排序的问题。当发生相应事件时,就会自动调用这些方法,所以你要实现这些方法。或者你在这些方法里面写一些代码展示你想要的效果。一般来讲,你直接在controller继承这个协议也是可以的。

UITableViewDataSource:

--The methods adopted by the object you use to manage data and provide cells for a table view.

    这个协议里面定义的方法主要是管理由cell提供的一些数据,也就是针对cell的一些操作相关的信息会在这些方法中展示或者使用,例如cell的索引,section的索引,有多少行,页头页脚的标题信息等。也就是说这个协议主要是微观上管理table操作所需要的信息,你也可以通过修改或者赋值给这些信息(方法的返回值)从而操作了table。一般来讲,你直接在controller继承这个协议也是可以的。

    而cell呢,就是一个视图,你当作UIView来用就好了啦,只是它会有一些系统默认提供的样式(即布局和子视图)。

协议里面的方法是实现不是重写啊,如果声明的方法不是required,你也可以不实现啊,父类的方法才有重写这么一说。

1、第一步,找两个类来遵循UITableViewDelegate协议和UITableViewDataSource协议,或者一个类就遵循这两个协议也可以,或者你直接就在controller遵循这两个协议好了。

2、设置tableView的数据对象和代理对象,就是给tableView的 dataSource属性和delegate 属性赋值

3、然后你看你要做什么咯,去实现“数据对象”和“代理对象”里面的方法咯,在“数据对象”的方法里面设置cell和cell的个数,节的数目;在“代理对象”中的方法设置点击事件,和一些响应事件,调整cell的高度等。

UITableViewDataSource协议里常用的方法有:

  • tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath):初始化和复用某个索引位置的UITableViewCell必须实现。所以你也可以对该索引位置进行判断,从而给该索引初始化特定的cell,不然重用也是可以的。你在这个方法里提供cell给table view。UITableView中的索引路径包括两个元素,第一个元素section是表格的章节序号,第二个元素row表示章节中的行序号。
  • tableView(_ tableView: UITableView, numberOfRowsInSection section: Int):设置某一章节(section)中的单元格数量,必须实现
  • numberOfSections(in tableView: UITableView):设置表格中的章节(section)个数。
  • tableView(_ tableView: UITableView, titleForHeaderInSection section: Int):设置指定章节的页眉标题文字,如果不设置或代理返回值为nil,不显示。每一节可以有页眉和页脚
  • tableView(_ tableView: UITableView, titleForFooterInSection section: Int):设置章节页脚标题文字,如果不设置或代理返回值为nil,不显示。
  • tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath):设置表格中指定索引位置的cell是否可编辑,可编辑的cell会显示插入和删除的图标。
  • tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath):当客户在屏幕上完成cell的插入或删除操作时会自动调用此方法。
  • tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath):设置指定索引位置的cell是否可以通过拖动的方式,改变它的位置。
  • tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath):cell从一个位置拖动到另一个位置时自动调用此方法。

UITableViewDelegate协议里的常用方法有:

  • tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath):设置单元格高度,每当表格需要显示时,都会调用此方法。
  • tableView(_ tableView: UITableView, heightForHeaderInSection section: Int)设置某一索引下的章节页眉的高度。
  • tableView(_ tableView: UITableView, heightForFooterInSection section: Int): 设置某一索引下的章节页脚的高度。
  • tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath):当指定索引位置上的单元格即将显示时,调用此方法。此方法是让代理对象有机会 在单元格显示之前 重写其状态属性,如背景颜色等。
  • tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath):当用户点击任一个索引位置的单元格时,调用此方法。
  • tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath):当用户点击一个已经被选中的单元格时,调用此方法

至于cell的话,这里就不详细说了,另外一篇博客里说吧。

 

好了,现在该说说UITableView的作用了。

首先是UITableView中的重用机制

       一个UITableView可能需要显示100条数据,但屏幕尺寸有限,假设一次只能显示9条,如果滑动一下的话,会显示出第10条的一部分,所以当前屏幕在这种情况下最多只能显示出10条,所以就算10条数据一个屏幕。

      超出屏幕的数据条目会从单元格对象池中获取,在重用队列中寻找指定ID标志符的cell,就不用再次初始化一个新的cell,如果没有这种reuseIdentifier的cell,那就需要新建一个你自己定义的cell。所以你的cell的那些标题什么的,最好就可以根据索引来确定,不要写死,这样就可以很好地进行重用,对性能很友好。(注意:只有当你所创建的cell数多于屏幕能够显示的数目时才会发生复用机制)

     而单元格对象池中的那些cell其实就是滑过屏幕后的cell,滑过后的在屏幕上的cell会被回收到对象池中进行存储,用于给“将要滑出来”的cell使用,节约内存。

--Call dequeueReusableCell(withIdentifier:) method only from the tableView(_:cellForRowAt:) method of your table view data source object.

      你只被允许在”数据对象“中的tableView(_:cellForRowAt:)方法中(注意:是在“数据对象”的方法中调用tableView的方法)调用tableView的dequeueReusableCell(withIdentifier:) 方法。苹果官网说的。这样就可以达到重用cell的效果。也就是说通过调用dequeueReusableCell方法获取的对象都是先看看对象池中是否有,从而直接重用。至于 重用对象池 中有多少个对象,我也不知道啊,可能是系统自动维护的吧。

    UITableView的属性和方法翻译,参考链接:https://blog.csdn.net/chokshen/article/details/53446273

   到时候用的时候再一个个自己总结了。

 

Class

UITableView

A view that presents data using rows arranged in a single column.

           --用于展示数据的一列多行的view,

 

Declaration

class UITableView : UIScrollView

Overview         --概览

Table views on iOS display a single column of vertically scrolling content, divided into rows. Each row in the table contains one piece of your app’s content. For example, the Contacts app displays the name of each contact in a separate row, and the main page of the Settings app displays the available groups of settings. You can configure a table to display a single long list of rows, or you can group related rows into sections to make navigating the content easier.

           table view是iOS上显示的一列多行的垂直滚动的视图内容。表中的每一行都包含app的一部分内容。例如,“联系人”app在单独的行中显示每个联系人的姓名,“设置”app的主页面显示可用的设置组。您可以将表配置为显示单个长行列表,也可以将相关行分组到节中,以便更轻松地导航内容。

Illustration showing the Contacts app and Settings app. The Contacts app uses a table to organize the user's individual contacts in a scrolling list. The Settings app displays different groups of settings in a scrolling list.

Tables are commonly used by apps whose data is highly structured or organized hierarchically. Apps that contain hierarchical data often use tables in conjunction with a navigation view controller, which facilitates navigation between different levels of the hierarchy. For example, the Settings app uses tables and a navigation controller to organize the system settings.

       --表通常由数据高度结构化或按层次结构组织的app使用。包含层次数据的app通常将表与导航视图控制器结合使用,这有助于在层次结构的不同级别之间导航。例如,设置app使用表和导航控制器来组织系统设置。

UITableView manages the basic appearance of the table, but your app provides the cells (UITableViewCell objects) that display the actual content. The standard cell configurations display a simple combination of text and images, but you can define custom cells that display any content you want. You can also supply header and footer views to provide additional information for groups of cells.

           --UITableView管理表的基本外观,但你的app要提供显示实际内容的单元格(UITableViewCell对象)。标准的cell配置了显示文本和图像的简单组合,但您也可以自定义cell来显示你所需的内容。您还可以提供页眉和页脚视图,以便为cell的group提供附加的信息。

 

Adding a Table View to Your Interface                   --在你的用户界面中添加table view

To add a table view to your interface, drag a Table View Controller (UITableViewController) object to your storyboad. Xcode creates a new scene that includes both the view controller and a table view, ready for you to configure and use.

           --若要将table view添加到界面中,请将表视图控制器(UITableViewController)对象拖动到storyboad中。Xcode创建了一个新scene,其中包括vc和tableview,可供您配置和使用。

Table views are data driven, normally getting their data from a data source object that you provide. The data source object manages your app’s data and is responsible for creating and configuring the table’s cells. If the content of your table never changes, you can configure that content in your storyboard file instead.

         --表视图是数据驱动的,通常从您提供的数据源对象获取它们的数据。数据源对象管理app的数据,并负责创建和配置表的cell。如果表的内容从未更改,则可以在脚本文件中(storyboard file)配置该内容。

For information about how to specify your table’s data, see Filling a Table with Data.

       -有关如何指定表数据的信息,请参见超链接:用数据填充表。

 

Saving and Restoring the Table's Current State          --保存和复原table的当前状态

Table views support UIKit app restoration. To save and restore the table’s data, assign a nonempty value to the table view’s restorationIdentifier property. When its parent view controller is saved, the table view automatically saves the index paths for the currently selected and visible rows. If the table’s data source object adopts the UIDataSourceModelAssociation protocol, the table stores the unique IDs that you provide for those items instead of their index paths.

         --表视图支持UIKit app的还原。要保存和还原表的数据,请为表视图的restorationIdentifier属性指定一个非空值。当表的父视图控制器被保存时,表视图会自动保存当前选定的行可见行的索引路径。如果表的数据源对象遵循了UIDataSourceModelAssociation协议,则表将为表中的item存储你提供的唯一的ID,而不是item的索引路径。

For information about how to save and restore your app’s state information, see Preserving Your App's UI Across Launches.

       --有关如何保存和还原应用的状态信息的信息,请参阅超链接:在发布时保留app的UI。

 

Topics                                                            --专题

Creating a Table View                   --创建一个table view

init(frame: CGRect, style: UITableView.Style)

Initializes and returns a table view object having the given frame and style.

init?(coder: NSCoder)

 

Providing the Table's Data and Cells             --提供table view的数据和cell

var dataSource: UITableViewDataSource?

The object that acts as the data source of the table view.

var prefetchDataSource: UITableViewDataSourcePrefetching?

The object that acts as the prefetching data source for the table view, receiving notifications of upcoming cell data requirements.

protocol UITableViewDataSource

The methods adopted by the object you use to manage data and provide cells for a table view.

protocol UITableViewDataSourcePrefetching

A protocol that provides advance warning of the data requirements for a table view, allowing you to start potentially long-running data operations early.

 

Recycling Table View Cells                        --循环使用table view的cell

func register(UINib?, forCellReuseIdentifier: String)

Registers a nib object containing a cell with the table view under a specified identifier.

func register(AnyClass?, forCellReuseIdentifier: String)

Registers a class for use in creating new table cells.

func dequeueReusableCell(withIdentifier: String, for: IndexPath) -> UITableViewCell

Returns a reusable table-view cell object for the specified reuse identifier and adds it to the table.

func dequeueReusableCell(withIdentifier: String) -> UITableViewCell?

Returns a reusable table-view cell object located by its identifier.

 

Recycling Section Headers and Footers                      --循环使用section的页眉页脚视图

func register(UINib?, forHeaderFooterViewReuseIdentifier: String)

Registers a nib object containing a header or footer with the table view under a specified identifier.

func register(AnyClass?, forHeaderFooterViewReuseIdentifier: String)

Registers a class for use in creating new table header or footer views.

func dequeueReusableHeaderFooterView(withIdentifier: String) -> UITableViewHeaderFooterView?

Returns a reusable header or footer view located by its identifier.

 

Managing Interactions with the Table                   --管理与表的交互

var delegate: UITableViewDelegate?

The object that acts as the delegate of the table view.

protocol UITableViewDelegate

Methods for managing selections, configuring section headers and footers, deleting and reordering cells, and performing other actions in a table view.

 

Configuring the Table's Appearance                      --配置table的外观

var style: UITableView.Style

The style of the table view.

enum UITableView.Style

Constants for the table view styles.

var tableHeaderView: UIView?

The view that is displayed above the table's content.

var tableFooterView: UIView?

The view that is displayed below the table's content.

var backgroundView: UIView?

The background view of the table view.

 

Configuring Cell Height and Layout                                --配置cell的高度和布局

var rowHeight: CGFloat

The default height (in points) of each row in the table view.

var estimatedRowHeight: CGFloat

The estimated height of rows in the table view.

var cellLayoutMarginsFollowReadableWidth: Bool

A Boolean value that indicates whether the cell margins are derived from the width of the readable content guide.

var insetsContentViewsToSafeArea: Bool

A Boolean value that indicates whether the table view repositions its content view to be within the current safe area.

 

Configuring Header and Footer Heights                    --配置页眉页脚的高度

var sectionHeaderHeight: CGFloat

The height of section headers in the table view.

var sectionFooterHeight: CGFloat

The height of section footers in the table view.

var estimatedSectionHeaderHeight: CGFloat

The estimated height of section headers in the table view.

var estimatedSectionFooterHeight: CGFloat

The estimated height of section footers in the table view.

 

Customizing the Separator Appearance                            --自定义分割线的外观

var separatorStyle: UITableViewCell.SeparatorStyle

The style for table cells used as separators.

enum UITableViewCell.SeparatorStyle

The style for cells used as separators.

var separatorColor: UIColor?

The color of separator rows in the table view.

var separatorEffect: UIVisualEffect?

The effect applied to table separators.

var separatorInset: UIEdgeInsets

The default inset of cell separators.

var separatorInsetReference: UITableView.SeparatorInsetReference

An indicator of how the separator inset value should be interpreted.

enum UITableView.SeparatorInsetReference

Constants indicating how to interpret the separator inset value of a table view.

 

Getting the Number of Rows and Sections               --获取row和section的数目

func numberOfRows(inSection: Int) -> Int

Returns the number of rows (table cells) in a specified section.

var numberOfSections: Int

The number of sections in the table view.

 

Getting Cells and Section-Based Views                  --获取cell和基于section的视图

func cellForRow(at: IndexPath) -> UITableViewCell?

Returns the table cell at the specified index path.

func headerView(forSection: Int) -> UITableViewHeaderFooterView?

Returns the header view associated with the specified section.

func footerView(forSection: Int) -> UITableViewHeaderFooterView?

Returns the footer view associated with the specified section.

func indexPath(for: UITableViewCell) -> IndexPath?

Returns an index path representing the row and section of a given table-view cell.

func indexPathForRow(at: CGPoint) -> IndexPath?

Returns an index path identifying the row and section at the given point.

func indexPathsForRows(in: CGRect) -> [IndexPath]?

An array of index paths, each representing a row enclosed by a given rectangle.

var visibleCells: [UITableViewCell]

The table cells that are visible in the table view.

var indexPathsForVisibleRows: [IndexPath]?

An array of index paths, each identifying a visible row in the table view.

 

Selecting Rows                                --选中行

var indexPathForSelectedRow: IndexPath?

An index path identifying the row and section of the selected row.

var indexPathsForSelectedRows: [IndexPath]?

The index paths representing the selected rows.

func selectRow(at: IndexPath?, animated: Bool, scrollPosition: UITableView.ScrollPosition)

Selects a row in the table view identified by index path, optionally scrolling the row to a location in the table view.

func deselectRow(at: IndexPath, animated: Bool)

Deselects a given row identified by index path, with an option to animate the deselection.

var allowsSelection: Bool

A Boolean value that determines whether users can select a row.

var allowsMultipleSelection: Bool

A Boolean value that determines whether users can select more than one row outside of editing mode.

var allowsSelectionDuringEditing: Bool

A Boolean value that determines whether users can select cells while the table view is in editing mode.

var allowsMultipleSelectionDuringEditing: Bool

A Boolean value that controls whether users can select more than one cell simultaneously in editing mode.

class let selectionDidChangeNotification: NSNotification.Name

Posted when the selected row in the posting table view changes.

 

Inserting, Deleting, and Moving Rows and Sections            --插入、删除、移动row和section

func insertRows(at: [IndexPath], with: UITableView.RowAnimation)

Inserts rows in the table view at the locations identified by an array of index paths, with an option to animate the insertion.

func deleteRows(at: [IndexPath], with: UITableView.RowAnimation)

Deletes the rows specified by an array of index paths, with an option to animate the deletion.

func insertSections(IndexSet, with: UITableView.RowAnimation)

Inserts one or more sections in the table view, with an option to animate the insertion.

func deleteSections(IndexSet, with: UITableView.RowAnimation)

Deletes one or more sections in the table view, with an option to animate the deletion.

enum UITableView.RowAnimation

The type of animation to use when rows are inserted or deleted.

func moveRow(at: IndexPath, to: IndexPath)

Moves the row at a specified location to a destination location.

func moveSection(Int, toSection: Int)

Moves a section to a new location in the table view.

 

Performing Batch Updates to Rows and Sections       --对row和section进行批量刷新

func performBatchUpdates((() -> Void)?, completion: ((Bool) -> Void)?)

Animates multiple insert, delete, reload, and move operations as a group.

func beginUpdates()

Begins a series of method calls that insert, delete, or select rows and sections of the table view.

func endUpdates()

Concludes a series of method calls that insert, delete, select, or reload rows and sections of the table view.

 

Configuring the Table Index                     --配置table的索引

var sectionIndexMinimumDisplayRowCount: Int

The number of table rows at which to display the index list on the right edge of the table.

var sectionIndexColor: UIColor?

The color to use for the table view’s index text.

var sectionIndexBackgroundColor: UIColor?

The color to use for the background of the table view’s section index.

var sectionIndexTrackingBackgroundColor: UIColor?

The color to use for the table view’s index background area.

class let indexSearch: String

A constant for adding the magnifying glass icon to the section index of a table view.

 

Reloading the Table View                    --再加载table view

var hasUncommittedUpdates: Bool

A Boolean value indicating whether the table view's appearance contains changes that are not reflected in its data source.

func reloadData()

Reloads the rows and sections of the table view.

func reloadRows(at: [IndexPath], with: UITableView.RowAnimation)

Reloads the specified rows using a given animation effect.

func reloadSections(IndexSet, with: UITableView.RowAnimation)

Reloads the specified sections using a given animation effect.

func reloadSectionIndexTitles()

Reloads the items in the index bar along the right side of the table view.

 

Managing Drag Interactions               --管理拖曳手势的交互

var dragDelegate: UITableViewDragDelegate?

The delegate object that manages the dragging of items from the table view.

protocol UITableViewDragDelegate

The interface for initiating drags from a table view.

var hasActiveDrag: Bool

A Boolean value indicating whether rows were lifted from the table view and have not yet been dropped.

var dragInteractionEnabled: Bool

A Boolean value indicating whether the table view supports drags and drops between apps.

 

Managing Drop Interactions                    --管理松开手势的交互

var dropDelegate: UITableViewDropDelegate?

The delegate object that manages the dropping of content into the table view.

protocol UITableViewDropDelegate

The interface for handling drops in a table view.

var hasActiveDrop: Bool

A Boolean value indicating whether the table view is currently tracking a drop session.

 

Scrolling the Table View                          --滚动table view

func scrollToRow(at: IndexPath, at: UITableView.ScrollPosition, animated: Bool)

Scrolls through the table view until a row identified by index path is at a particular location on the screen.

func scrollToNearestSelectedRow(at: UITableView.ScrollPosition, animated: Bool)

Scrolls the table view so that the selected row nearest to a specified position in the table view is at that position.

enum UITableView.ScrollPosition

The position in the table view (top, middle, bottom) to which a given row is scrolled.

 

Putting the Table into Edit Mode                      --设置table为编辑状态

func setEditing(Bool, animated: Bool)

Toggles the table view into and out of editing mode.

var isEditing: Bool

A Boolean value that determines whether the table view is in editing mode.

 

Getting the Drawing Areas for the Table               --获取table view的可绘制区域

func rect(forSection: Int) -> CGRect

Returns the drawing area for a specified section of the table view.

func rectForRow(at: IndexPath) -> CGRect

Returns the drawing area for a row identified by index path.

func rectForFooter(inSection: Int) -> CGRect

Returns the drawing area for the footer of the specified section.

func rectForHeader(inSection: Int) -> CGRect

Returns the drawing area for the header of the specified section.

 

Remembering the Last Focused Cell                       --记住上一个获得焦点的cell

var remembersLastFocusedIndexPath: Bool

A Boolean value that indicates whether the table view should automatically return the focus to the cell at the last focused index path.

 

Relationships                   --继承关系

Inherits From

UIScrollView

Conforms To

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值