Articles of uitableview

UITableView iOS中的分隔线

编辑分隔线的宽度 您可以通过更改单元格上的layoutMargins:属性来设置使表格视图的分隔线在表格中扩展到各种宽度。 这可以通过多种方式来实现。 更改特定单元格的分隔线 在表视图数据源的cellForRowAtIndexPath:方法或 willDisplayCell:方法中,将单元格的layoutMargins:属性设置为UIEdgeInsetsZero(扩展到表的整个宽度),或者设置为此处所需的值。 目标C [cell setLayoutMargins:UIEdgeInsetsZero]; //也可以使用spacerInset [cell setSeparatorInset:UIEdgeInsetsZero]; 迅速 func tableView(tableView:UITableView,willDisplayCell单元格:UITableViewCell,forRowAtIndexPath indexPath:NSIndexPath){ cell.separatorInset = UIEdgeInsetsZero cell.layoutMargins = UIEdgeInsetsZero } func tableView(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath)-> UITableViewCell { cell.separatorInset = UIEdgeInsetsZero cell.layoutMargins = UIEdgeInsetsZero } 删除所有分隔线 每个单元格之间的细灰色线可能并不完全是您要的外观。 将它们隐藏起来非常简单。 在您周围的UIViewController的viewDidLoad:方法中,添加以下代码。 您也可以在加载或重新加载表视图之前随时设置此属性(不一定需要在viewDidLoad:方法中)。 迅速: tableView.separatorStyle = .None 目标C: tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 另外,可以通过选择tableView并将分隔符(在属性检查器下)设置为None来在Storyboard或XIB中更改属性。 隐藏多余的分隔线 您可以通过在UITableView的底部设置一个空的页脚视图来隐藏空单元格的UITableViewCell分隔线: 迅速 tableView.tableFooterView = UIView() […]

如何干净地隐藏UITableView节

采取任何应用程序。 前往设置。 您很有可能会找到带有分组节的UITableView。 大多数应用程序至少使用一个UITableView子类构建,并且经常需要根据用户设置或对功能的访问来显示/隐藏特定部分。 我们没有开箱即用的隐藏功能 UITableView是UIScrollView的子类,自iOS 2.0起就存在,它没有方便的isHidden属性,因此必须在数据源和委托中处理逻辑。 当逻辑跨越协议实现时,这很快就会变得像意大利面条。 最小化代码复杂度 试图处理每个特定情况并在显示节时将numberOfSections设置为n ,在隐藏节时将cellForRowAt indexPath设置为n-1 ,但是当我们必须处理cellForRowAt indexPath和后续设置中的单个单元逻辑时,这变得很复杂。 有40多个数据源和委托方法可以跟踪,并且代码维护从这里变得很棘手。 有更好的方法。 解决方案 让我们从numberOfRowsInSection开始,然后return 0以将Section隐藏 。 这是一个好的开始,但是由于页眉/页脚的填充,我们仍然会以一个空的部分结束,这会占用空间。 调整布局 要调整额外的间距,我们可以覆盖委托方法heightForHeaderInSection并为隐藏部分返回CGFloat.leastNonzeroMagnitude 。*请注意,此处返回0无效; 高度必须有一个值。 覆盖func tableView(_ tableView:UITableView,heightForHeaderInSection部分:Int)-> CGFloat { 返回shouldHideSection吗? CGFloat.leastNonzeroMagnitude:20 } 如果您已经覆盖titleForHeaderInSection ,则还需要将节标题设置为nil 。 重写func tableView(_ tableView:UITableView,titleForHeaderInSection部分:Int)->字符串? { 返回shouldHideSection吗? nil:“部分标题” } *您可能还需要覆盖storyboard中的heightForFooterInSection或将页脚值设置为<1。

具有自动调整大小单元格的自调整TableView的简单解决方案

几天前,我读了一篇简单但精彩的文章,名为Swift 4食谱: Dushyant Bansal的自调整表格视图 (底部的链接)。 他在那里所做的工作非常简单易懂。 他覆盖了reloadData()函数和UITableView的intrinsicContentSize变量。 该解决方案对许多应用程序都很方便,我在其中一个项目中使用了它。 我在这里利用他的一些资源来证明他的所作所为。 这是他使用的Custom类。 问题是,它仅适用于相同大小的单元 。 如果要将此SelfSizedTableView类应用于“ 自动调整表”视图单元格大小 ,则需要扭曲intrinsicContentSize变量。 修改后的代码将如下所示: 覆盖var internalContentSize:CGSize { setNeedsLayout() layoutIfNeeded() 设高度=最小值(contentSize.height,maxHeight) 返回CGSize(width:contentSize.width,height) } 只需在计算高度之前添加setNeedsLayout()和layoutIfNeeded() 。 你们都准备好了。 😆 我想提 如果您使用预设数据(不是来自API)用于tableView,请在viewDidAppear()方法中使用tableView.reloadData()获得效果。 如果要从API提取数据,则已经在API响应块中使用了tableView.reloadData() ,不是吗?

在您的ViewController中使用多个tableView或CollectionView

曾几何时,我为一个项目编写代码,该项目的第一页中有很多表和集合视图。 我记得我曾经用“容器视图”解决了这个问题,但这是一个错误的决定……。 另一个好用的选择是“滚动视图” ,它很容易实现,但操作起来又费时。 由于委托是一个协议,我认为有一个好的方法…… 协议和代表示例 协议和委托示例–在一个ViewController中使用多委托 github.com 首先创建一个NSObject类,以减少自定义,然后添加要用作超类的所有委托方法。 将Model属性添加到您的类中以进行设置并获取所有要显示的信息。 在我的情况下,数据模型名称为ItemManager。 创建一个dataModel类,并将其分配给您的DataProvider的Model。 自定义所有方法并设置DataModel之后,是时候将类设置为UITableView或UICollectionView的协议了。 使用Techniq的好处还在于您可以在应用程序中使用单元测试,我真的建议您阅读使用Swift 4进行测试驱动的iOS开发–第三版作者:Dominik Hauser博士 使用Swift 4进行测试驱动的iOS开发–第三版– PDF电子书| 现在只要$ 5 使用测试驱动的方法通过Swift 4和Xcode 9开发功能强大的iOS应用 www.packtpub.com

为iOS制作有状态的TableView

很明显,在为UITableView加载数据时,我们经常面临以下状态。 数据可用于表视图。 数据已成功加载,但列表为空。 服务器端意外挂断(😇我该振作起来了)。 应用程序无法到达服务器。 请求超时(⏱)。 完全没有互联网连接。 任何其他未知错误(🤔)。 在我的最后两个项目中,我面对了很多东西。 像往常一样,我试图找出自己的解决方案。 这导致我创建了我的第一个pod库。 听起来真的很好(💪)。 UITableView上的轻量级包装器: 在UITableView上创建包装器之后,我终于解决了问题。 它基本上是UITableView的子类,具有一些实用程序方法,可以根据我上面提到的表视图的状态显示适当的消息。 如何开始? 使用Xcode创建单个视图项目,并使用cocoapods安装以下pod库。 如果在安装执行pod init时反复遇到以下错误 -bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory 您需要使用以下命令在macOS High Sierra上重新安装Pod sudo gem安装cocoapods` 现在在您的Podfile包含Podfile 。 pod’SDStateTableView’ 完成安装后,请使用 pod install命令,您需要打开.xcworkspac e Xcode上的文件。 如果在安装Pod时遇到任何问题,可以从GitHub下载入门项目。 如果一切正常,则可以替换项目的Assets.xcassets 与来自GitHub的所需资产。 它包含一些资产,根据状态显示在表格视图中。 抱歉,我不会向您展示如何在客户项目中将原始资源集与该库一起使用。 但是,我保证您将能够处理上述针对UITableView的所有状态。 让我们构建基本的UI: 打开Main.storyboard文件。 让我们将UITableView从View Controller Scene的UI Library部分中拖放以下约束。

UITableView分隔符插入0不起作用

iOS在单元格和表视图上引入了layoutMargins属性。 此属性在iOS 7.0上不可用,因此您需要确保在分配前检查一下! 此外,Apple已向您的单元格中添加了一个属性,以防止其继承您的Table View的边距设置。 设置此属性后,将允许单元独立于表格视图配置其自身的边距。 将其视为替代。 此属性称为preservesSuperviewLayoutMargins ,并将其设置为NO将允许单元格的layoutMargin设置覆盖在TableView上设置的所有layoutMargin 。 既节省时间( 您不必修改表视图的设置 ),又更简洁。 请参阅Mike Abdullah的答案以获取详细说明。 注意:下面是 Mike Abdullah的回答所表示 的 单元格级边距设置 的干净实现 。 设置单元格的preservesSuperviewLayoutMargins = NO将确保您的表视图不会覆盖单元格设置。 如果您实际上希望整个表格视图具有一致的边距,请相应地调整代码。 设置您的单元格边距: -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { //删除分隔符插图 如果([单元格responsToSelector:@selector(setSeparatorInset :)]){ [cell setSeparatorInset:UIEdgeInsetsZero]; } //防止单元格继承表视图的边距设置 如果([单元格responsesToSelector:@selector(setPreservesSuperviewLayoutMargins :)]){ [cell setPreservesSuperviewLayoutMargins:NO]; } //明确设置单元格的布局边距 如果([单元格responsesToSelector:@selector(setLayoutMargins :)]){ [cell setLayoutMargins:UIEdgeInsetsZero]; } } 斯威夫特4: func […]

为UITableView创建粘性标头

*本教程使用Swift 2.3 我是Rep的产品和工程负责人,Rep是一个有影响力的市场,品牌和有影响力的人可以在市场营销活动中进行协作。 我决定分享如何在应用程序中构建此功能。 (对于这里的任何产品猎人,请随时追捕我们:)!) 一段时间以来,我一直在寻找一种简单的解决方案,并且严格避免出现可疑的骇客程序。 在使用XCode几个小时之后,我想出了一个很棒的方法来解决这个问题。 我将为文章提要构建UI。 外观如下: 现在,进入一些代码。 让我们添加标题,背景图像视图,文章图标和背景Alpha层。 我以编程方式使用自动布局对所有视图进行布局,但是可以根据需要随意创建视图。 我们首先需要添加所需的初始化程序和属性: 类CategoryHeaderView:UIView { var imageView:UIImageView! var colorView:UIView! var bgColor = UIColor(红色:235/255,绿色:96/255,蓝色:91/255,alpha:1) var titleLabel = UILabel() var articleIcon:UIImageView! init(frame:CGRect,title:String){ self.titleLabel.text = title.uppercaseString super.init(frame:框架) } 需要初始化吗?(编码器aDecoder:NSCoder){ fatalError(“ init(coder :)尚未实现”) } } 接下来,使用autolayout以编程方式对所有视图进行布局,并在init()末尾调用此setUpView()函数。 我们开始从后到前布置视图。 顺序为imageView,colorView,titleLabel,articleIcon。 func setUpView(){ self.backgroundColor = UIColor.whiteColor() imageView = UIImageView() imageView.translatesAutoresizingMaskIntoConstraints = false […]

UITableView自定义大小的单元格(使用UITableViewAutomaticDimension自动计算行高)

一个简单,用途广泛但功能强大的视图,可以使用行和单个列以列表形式显示数据。 用户可以在表视图中垂直滚动项,并可以选择操作和选择内容。 自定格单元 苹果公司推出了自动上浆电池。 使用Autolayout显式地布局UITableViewCells,UITableView会为您处理其余的工作。 行高是自动计算的,默认情况下rowHeight值为UITableViewAutomaticDimension。 在计算自调整大小的单元格时,将使用UITableView属性estimatedRowHeight。 创建自定义大小的表格视图单元格时,需要设置此属性并使用约束来定义 单元的大小。 — Apple,UITableView文档 self.tableView.estimatedRowHeight = 44.0 请注意,如果要为所有单元格设置动态高度,则不需要 tableView的委托的heightForRowAtIndexPath。 只需在必要时以及重新加载或加载表格视图之前设置以上属性。 但是,您可以通过以下功能设置特定单元格的高度,同时使其他单元格动态化: 迅速 覆盖func tableView(tableView:UITableView,heightForRowAtIndexPath indexPath:NSIndexPath)-> CGFloat { 切换indexPath.section { 情况1: 返回60 默认: 返回UITableViewAutomaticDimension } } 目标C -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 开关(indexPath.section){ 情况1: 返回60; 默认: 返回UITableViewAutomaticDimension; } }

UITableView与来自API的图像

UITableView是一种以列表方式显示结构化数据的好方法。 与Android不同,iOS在促进开发人员使用UITableView方面做得很好。 当您的应用程序显示来自API调用的数据时,事情的学习曲线确实陡峭。 在这里曲线不会停止变陡。 如果您计划在UITableViewCell中显示图像,它将变得有些棘手。 这正是我们今天要做的。 我们打算做什么? 我不打算深入研究UITableView实现。 我给你创造的自由,可以根据需要设计UITableViewCell并使基本应用程序正常工作。 首先使用虚拟数据和占位符图像测试UITableView始终是一个好主意。 一旦您的UITableView启动并运行了虚拟数据和占位符图像,请从GitHub API获取内容。 您可以通过请求以下URL来获得您的GitHub关注者。 https://api.github.com/users/ / followers API响应将具有许多键值。 我们将限制本帖子的图片和名称。 假设您知道如何进行网络调用和解析响应数据以显示在UITableViewCell上,现在让我们集中讨论您应该面对的两个问题 表格视图滚动很慢。 滚动UITableView时,图像会更改。 用户A的个人资料图片可能与用户B的名字一起出现 问题1:为什么UITableView滞后? 当您尝试在UITableViewCell的UIImageView上呈现图像时,将进行网络调用,该网络调用将从图像url获取图像数据,然后使用响应数据创建图像。 每次创建单元时都会发生这种情况。 假设您有3个UITableViewCells,那么将有3个网络调用来获取每个单元格的图像。 当我们处理更多单元格时,随着UITableView重用单元格,此问题会放大。 我如何摆脱时滞? 为了恢复完美的滚动效果,我们可以使用多任务处理。 我们将在后台获取图像数据,并且在接收到图像数据后,将用从API调用接收到的图像替换占位符图像。 在cellForRowAtIndexPath中, DispatchQueue.global(qos:.background).async { 让url = URL(string:(activeUser?.avatarUrl)!) 让数据=尝试? 数据(contentsOf:url!) 让图像:UIImage = UIImage(data:data!)! DispatchQueue.main.async { self.imageCache.setObject(image,forKey:NSString(string:(activeUser?.login!)!)) cell.imgFollow.image =图片 } } 但是,如果图像数据从未收到怎么办? 这是占位符为您提供帮助的地方。 如果未接收到图像数据,则UITableViewCell将具有占位符图像。 问题2:为什么图像在滚动时会不断变化? 如上所述,每次创建UITableViewCell时都会进行网络调用。 说,您的单元格已创建,图像请求已发出,但是在图像响应完成之前,您滚动到另一个单元格。 tableview不知道数据。 […]

UITableView入门(有关编写简洁代码的提示)

将表视图添加到视图控制器并设置约束,如下所示。 拖动Table View Cell,并将Style设置为Right Detail,并将单元格标识符设置为’cell’。 稍后我们将相应地进行调整。 我通常按​​照上面显示的方法处理表视图,只是为了给我更大的灵活性。 运行模拟器,您可以看到我们的数据列表已正确填充。 请注意,我们正在使用提供给我们的4种基本样式之一。 继续尝试将tableview 样式更改为Subtitle,然后重新运行模拟器。 很好! 您已经使用一些数据创建了第一个表格视图! 我们已经获得了符合UITableViewDataSource和UITableViewDelegate协议的UIViewController,并将其设置为UITableView的数据源和委托。 这仅适用于几行代码,但可以想象如果UIViewController以后在应用程序中有更多事情要做,该类可能会变得肿。 它将承担太多责任,并且只会使其难以维护,阅读或测试。 因此,让我们继续重构代码。