UITableViewCell

腾讯开源 iOS 内存监控组件和OOM检测工具

谁说胖子不能爱 提交于 2021-02-20 19:57:20
自阿里巴巴开源Android检测内存泄露工具 LeakCanary 后,腾讯开源了一个在iOS 内存监控组件和一个OOM检测工具。 MLeaksFinder MLeaksFinder 是腾讯开源的 iOS 平台的自动内存泄漏检测工具,引进 MLeaksFinder 后,就可以在日常的开发,调试业务逻辑的过程中自动地发现并警告内存泄漏。开发者无需打开 instrument 等工具,也无需为了找内存泄漏而去跑额外的流程。并且,由于开发者是在修改代码之后一跑业务逻辑就能发现内存泄漏的,这使得开发者能很快地意识到是哪里的代码写得问题。这种及时的内存泄漏的发现在很大的程度上降低了修复内存泄漏的成本。 特性: 自动检测内存泄漏和释放不及时的场景 构建泄漏对象相对于 ViewContrller 的引用链以帮助开发者定位问题 不侵入业务逻辑,引入即生效,无需修改任何代码或引入头文件 用法 MLeaksFinder 可自动查找 UIView 和 UIViewController 对象中的泄漏。当发生泄漏时,它会在 View-ViewController 堆栈中显示泄漏对象预警。 Memory Leak ( MyTableViewController , UITableView, UITableViewWrapperView, MyTableViewCell ) OOMDetector

iOS 可高度自定义的底部弹框

纵饮孤独 提交于 2021-02-17 10:03:07
技术: iOS Objective-C 概述 一个可以让开发者通过编写 tableView 的内容随心所欲的定制自己想要的底部弹框 详细 代码下载: http://www.demodashi.com/demo/14901.html 一. 运行效果图 二. 实现过程 1. 实现一个有遮罩效果的半透明 view,然后添加一个可设置展示内容高度的 contentView // 这个遮罩是可以遮住全屏 - (void)createUI{ self.frame = CGRectMake(0, 0, SS_ScreenW, SS_ScreenH); self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.4]; self.userInteractionEnabled = YES; [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(disMissView)]]; [self.contentView addSubview:self.tbView]; } // contentView 是通过懒加载实现的 - (UIView *)contentView{ if (!

iOS扩展Extension之Today

旧街凉风 提交于 2021-01-13 22:14:11
1、简介   扩展(Extension)是iOS 8中引入的一个新特性。扩展让app之间的数据交互成为可能。在iOS 8系统之前,每一个app在物理上都是彼此独立的,app之间不能互访彼此的私有数据。而在引入扩展之后,其他app可以与扩展进行数据交换。iOS 8系统有6个支持扩展的系统区域,分别是Today、Share、Action、Photo Editing、Storage Provider、Custom keyboard。支持扩展的系统区域也被称为扩展点。本文只简单记录Today的使用! 2、Today扩展的创建   方法一:通过路径File -->New -->Target创建!   方法二:直接点击项目-->点击 + 即可! 2、Today简介和方法说明   Today扩展的一种,虽然依附在App中,但是它是单独的个体,所使用的文件、资源、第三方等,都需要单独设置!   Today创建之后,其实就是一个ViewController!最小高度为110pt。有三方协议方法: // iOS10 新增的方法 // 用来设置Widget是展开还是折叠状态的方法,可以设置相关的preferredContentSizes属性修改大小 - ( void )widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode

iOS列表性能优化之异步绘制

被刻印的时光 ゝ 提交于 2020-12-17 14:27:54
Python实战社群 Java实战社群 长按识别下方二维码, 按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群 ▲ 作者 | Mkit 来源 | 掘金 https://juejin.cn/post/6901957495548608525#heading-20 一、需求背景 1、现状 iOS所提供的UIKit框架,其工作基本是在主线程上进行,界面绘制、用户输入响应交互等等。当大量且频繁的绘制任务,以及各种业务逻辑同时放在主线程上完成时,便有可能造成界面卡顿,丢帧现象,即在16.7ms内未能完成1帧的绘制,帧率低于60fps黄金标准。目前常用的UITableView或UICollectionView,在大量复杂文本及图片内容填充后,如果没有优化处理,快速滑动的情况下易出现卡顿,流畅性差问题。 2、需求 不依赖任何第三方pod框架,主要从异步线程绘制、图片异步下载渲染等方面,尽可能优化UITableView的使用,提高滑动流畅性,让帧率稳定在60fps。 (网上有很多优秀的性能优化博客和开源代码,本方案也是基于前人的经验,结合自身的理解和梳理写成demo,关键代码有做注释,很多细节值得推敲和持续优化,不足之处望指正。) 二、解决方案及亮点 1、方案概述 • 异步绘制任务收集与去重; • 通过单例监听main runloop回调,执行异步绘制任务; •

iOS:手势与矩形、点运算相关(18-01-24更)

别说谁变了你拦得住时间么 提交于 2020-11-23 06:34:46
1、矩形、点运算   1、获取当前的View在Window的frame   2、包含判断   3、获取点击在响应者 touchesBegan 的位置   4、UIScrollView、UITableView 实时 位置 相关 2、手势   1、点击(UITapGestureRecognizer)   2、拖移(UIPanGestureRecognizer)、轻扫(UISwipeGestureRecognizer)   3、长按(UILongPressGestureRecognizer)   4、旋转(UIRotationGestureRecognizer)   5、捏合(UIPinchGestureRecognizer) 3、触摸    0、写在前面   可通过 NSStringFromCGPoint 等方法,用"%@"调试输出,不用再 point.x、point.y 列出来。rect 方法同。 1、矩形、点运算   1、获取当前的View在Window的frame UIWindow * window=[[[UIApplication sharedApplication] delegate] window]; CGRect rect=[_myButton convertRect:_myButton.bounds toView:window];   后续补充:     toView

iOS 11.0适配:UITableView的contentSize的计算问题

不打扰是莪最后的温柔 提交于 2020-10-24 14:02:25
一 起因 我在开发中接到一个需求,当UITableView所显示的内容不满一屏时要隐藏上拉控件所显示的“我是有底线的”,我理所当然在封装的UITableView的reloadData调用这么一个方法: if ( self .contentSize.height <= self .frame.size.height){ self .mj_footer.hidden = YES ; } else { self .mj_footer.hidden = NO ; } 这对于iOS 11.0以下能解决问题,但iOS 11.0 以上的系统却不起作用 二 原因 经过我用log信息输出发现,在iOS 11.0 以上的系统 self .contentSize.height 的值总是等于44乘以UITableView的 cell的个数得到的,在网上查阅相关资料 发现在 iOS11,默认打开了estimatedRowHeight估算高度功能,当tableView创建完成后,contentSize为estimatedRowHeight(默认值为44)*cell的数量,更加详细的请看 http://www.cocoachina.com/ios/20171109/21103.html 三 解决办法 我们可以让estimatedRowHeight=0,关闭这个预估高度的效果 来源: oschina 链接:

【Swift】UITableViewDiffableDataSource的用法

左心房为你撑大大i 提交于 2020-10-06 12:27:33
  在 iOS 13 中 Apple 为 UITableView 和 UICollectionView 引入了 DiffableDataSource,让开发者可以更简单高效的实现 UITableView、UICollectionView 的局部数据刷新。新的刷新的方法为 apply,通过使用 apply 方法无需计算变更的 indexPaths,也无需调用 reload,即可安全地在主线程或后台线程更新 UI, 仅需简单的将需要变更后的数据通过 NSDiffableDataSourceSnapshot 计算出来。   1、使用 DiffableDataSource 配置当前 UITableView 的数据源。 func getDataSource() -> UITableViewDiffableDataSource<Section, Note>? { return UITableViewDiffableDataSource(tableView: self.tableView) { (tableView, indexPath, note) -> UITableViewCell? in let cell = UITableViewCell() cell.textLabel ?.text = note.content return cell } }   2、在需要刷新的时候,使用

【iOS】解决UICollectionView中使用reloadItemsAtIndexPaths进行局部cell更新导致视图重叠问题

a 夏天 提交于 2020-08-18 06:52:31
  UICollectionView与UITableView类似,都可以使用reloadData来进行cell内容的更新。   UICollectionView可以采用reloadItemsAtIndexPaths方法。 self.collectionView.reloadItems(at: [indexPath])   传入参数就是要刷新的cell所在的indexPath组成的数组。   但,reloadItemsAtIndexPath默认会有一个动画的过程,cell内容更新的瞬间会出现原内容与新内容重叠的情况。那么使用如下方式取消该动画即可: UIView.performWithoutAnimation { self.collectionView.reloadItems(at: [indexPath]) }   而使用reloadData进行全部cell的更新,则没有这个默认的动画过程。 来源: oschina 链接: https://my.oschina.net/u/4386991/blog/4306368

如何禁用UITableView选择?

跟風遠走 提交于 2020-08-14 05:37:33
问题: When you tap a row in a UITableView , the row is highlighted and selected. 当您在 UITableView 点击一行时,该行将突出显示并被选中。 Is it possible to disable this so tapping a row does nothing? 是否可以禁用此功能,因此点击一行什么都不做? 解决方案: 参考一: https://stackoom.com/question/nfA/如何禁用UITableView选择 参考二: https://oldbug.net/q/nfA/How-can-I-disable-the-UITableView-selection 来源: oschina 链接: https://my.oschina.net/u/4428122/blog/4492921

iOS小技巧总结,绝对有你想要的(持续更新)

爱⌒轻易说出口 提交于 2020-08-12 03:42:40
最近在这里总结一些iOS开发中的小技巧,能大大方便我们的开发。 UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0.1)]; self.tableView.tableHeaderView = view; UITableView的plain样式下,取消区头停滞效果 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat sectionHeaderHeight = sectionHead.height; if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView;.contentOffset.y>=0) { scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0); } else if(scrollView.contentOffset.y>=sectionHeaderHeight) { scrollView.contentInset = UIEdgeInsetsMake(