常用开发技巧系列(二)
一:你经常看到的MD5加密总结代码详解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // MD5加密方法 - (NSString *)translateToMD5:(NSString *)input { // 把字符串转换成UTF-8编码格式 const char *cStr = [input UTF8String]; // 开辟一个16字节 unsigned char digest[16]; // 把转化的 cStr 经过MD5加密,不可逆的存贮到digest中 CC_MD5( cStr, (CC_LONG)strlen(cStr), digest ); // 获取一个长度是 加密了的字符串长度 * 2 的可变字符串 NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; // 循环遍历digest for ( int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) //x表示十六进制,%02X 意思是不足两位将用0补齐,如果多余两位则不影响 //遍历取出值要做16进制处理,不能直接取出来用 [output appendFormat: @"%02x" , digest[i]]; return output; } |
二: 怎样去判断APP是不是第一次启动
这个我们最常用的就是在APP引导页的制作中,下面的代码就设计到怎样去具体的判断是不是第一次启动,还有一个是第一次启动的时候,加载引导页的一个三方库,眼睛仔细一点你就能看到,这个是在公司项目中有用到的,我也把整个判断的代码给出来,有兴趣的也可以去搜一下里面的引导页三方库;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | //是否第一次启动 - ( void )showFirstLaunch { // 这里的思想是要是比较之前保存的版本,要是现在的版本比值保存的版本要高,则为一个新的版本,需要展示指导页 // CFBundleShortVersionString 表示 bundle 发布版本号 NSString *bundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString" ]; // 把版本信息转化成String类型 NSString *appFirstStartOfVersionKey = [NSString stringWithFormat: @"first_start_%@" , bundleVersion]; // 获取先前存起来的版本信息 NSNumber *alreadyStartedOnVersion = [[NSUserDefaults standardUserDefaults] objectForKey:appFirstStartOfVersionKey]; // 版本已经存在 // isEqual 可以去直接比较两个版本字符串是否相等 if (!alreadyStartedOnVersion || [alreadyStartedOnVersion boolValue] == NO) { //displayInView 展现在View上的方法 //ESIntroView 三方的东西 [[ESIntroView introSection] displayInView:self.window.rootViewController.view]; // 把先前的版本存起来 [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:appFirstStartOfVersionKey]; } } |
三:项目要求添加一个投资者的认证,要的大概是这样的一个效果:
想了一下,第一题和第二题之间按钮的选择是不能相互影响的,在第一题之间呢,你的按钮得保证只能选中一个或者不选中,这个是正常的需求,刚开始在想怎样创建来保证第一题和第二题之间的按钮选择没有影响呢,并且这个第二题能保证选项之间按钮只能被选中一个后者不选呢?。
大体思路:
把一道题当一个View进行模块化处理,我们写一个view继承与UIView,它创建的次数和位置则由题目的数目来控制,然后在它里面去创建按钮,按钮的个数由选项个数控制。 这样问题也就解决了,循环调用创建View,所创建的View之间就不会有影响,至于三个按钮之间只能选一个,就在这个view里面去处理。这个也搞定了,要是有需要的可以加我QQ,我发文件给你!
四:看看这个效果
这个是现在项目中的框架,刚写好,也封装好了,以后有这种需求,下面两个方法就能搞定!
1 2 3 4 5 | //执行执行此方法之前必须要设定 SliderView的 frame -( void )setViewControllers:(NSArray *)viewControllers owner:(UIViewController *)parentViewController; //获取顶部的控制滚动视图 -(UIView *)topControlViewWithFrame:(CGRect)frame titleLabelWidth:(CGFloat)titleLabelWidth; |
这个文件的使用我也放在了Git上了,链接给大家 https://github.com/TaoaXu/CutScrollViewDemo.git
七:关于Label文字处理的一些常用的类别列举
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // 把label上面的文字置顶 - ( void )alignTop { CGSize fontSize = [ self .text sizeWithAttributes:@{ NSFontAttributeName : self .font}]; double finalHeight = fontSize.height * self .numberOfLines; double finalWidth = self .frame.size.width; //expected width of label CGSize theStringSize = [ self .text boundingRectWithSize:CGSizeMake(finalWidth, finalHeight) options: NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingUsesDeviceMetrics | NSStringDrawingTruncatesLastVisibleLine attributes:@{ NSFontAttributeName : self .font} context: nil ].size; int newLinesToPad = (finalHeight - theStringSize.height) / fontSize.height; for ( int i=0; i<newLinesToPad; i++) self .text = [ self .text stringByAppendingString:@ "\n " ]; } // 把label上面的文字置底 - ( void )alignBottom { CGSize fontSize = [ self .text sizeWithAttributes:@{ NSFontAttributeName : self .font}]; double finalHeight = fontSize.height * self .numberOfLines; double finalWidth = self .frame.size.width; //expected width of label CGSize theStringSize = [ self .text boundingRectWithSize:CGSizeMake(finalWidth, finalHeight) options: NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingUsesDeviceMetrics | NSStringDrawingTruncatesLastVisibleLine attributes:@{ NSFontAttributeName : self .font} context: nil ].size; int newLinesToPad = (finalHeight - theStringSize.height) / fontSize.height; for ( int i=0; i<newLinesToPad; i++) self .text = [ NSString stringWithFormat:@ " \n%@" , self .text]; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | // Label 根据有的宽度自适应返回高 + (CGFloat)getHeightByWidth:(CGFloat)width title:( NSString *)title font:(UIFont *)font { UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, 0)]; NSMutableAttributedString *attStrSupplier = [[ NSMutableAttributedString alloc]initWithString:title]; //创建NSMutableParagraphStyle实例 NSMutableParagraphStyle *styleSupplier = [[ NSMutableParagraphStyle alloc]init]; //设置行距 [styleSupplier setLineSpacing:14.0f]; [attStrSupplier addAttribute: NSParagraphStyleAttributeName value:styleSupplier range: NSMakeRange (0,title.length)]; label.attributedText =attStrSupplier; label.text = title; label.font = font; label.numberOfLines = 0; [label sizeToFit]; CGFloat height = label.frame.size.height; return height; } // Label 根据有的文字自适应返回宽 + (CGFloat)getWidthWithTitle:( NSString *)title font:(UIFont *)font { UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 1000, 0)]; label.text = title; label.font = font; [label sizeToFit]; return label.frame.size.width; } |
八:你可能经常头疼的cell高度的自适应问题
等看了下面的,这个问题保证让你药到病除,最近公司的项目真的是很赶很赶,没有时间去好好写博客,不过不写心里慌,说说这个cell的自适应,以前这快的东西,不能说是个大难题,但也挺烦的,最近看到这个三方,UITableView+FDTemplateLayoutCell,它和Masonry配合一起使用,感觉棒棒哒,也是加到了自己的项目当中去了,git链接给大家,要是还有什么问题可以加我Q或者是在下面留言我们交流。看看这里Demo的效果和简单地使用:
说说我这里几点需要注意的:
1,不要把约束写到 -(void)layoutSubviews 方法里面,测试过是没有效果的。
2,上面效果里买的换行的这个Label,你把 numberOfLines 设置成0后,就不要再去管它的高度,设置它到底部的约束就够了,就像上面的这个换行像是内容的Label,需要做的约束就是 左边,右边,距离名字Label的约束,和距离下面的约束,其他的不用管,这样效果就有了。。
3,当然,你要是再计算它们的Frame值的,也可以通过这个三方设置,要是有这方面的需求,上面说的,联系我。。给demo你。
4,维护团队的介绍这个三方的技术文章链接也给大家。
5,再给大家两篇觉得介绍这个三方写得不错的博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2015-11-15 项目中总结积累的一些实用的博客连接(价值连城!此博客一直在不断更新)