OC踩坑指南(不定期更新)

2024-02-26 09:48
文章标签 更新 指南 oc 不定期

本文主要是介绍OC踩坑指南(不定期更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.iOS11上上出现UIToolbar上添加按钮,button点击事件无法响应问题
解决办法: 在iOS11以上的情况下 UIToolbarUIToolbarContentView会出现覆盖在视图最上层情况,导致后续添加的按钮无法点击,所以为了避免这种情况下按钮无法点击需要在将UIToolbar添加到UI层上之后立马[toolbar layoutIfNeeded];。降低UIToolbarContentView的层级关系
2.在iPhone5C上 [UIFont fontWithName:familyNamed size:font] 方法不会被正确执行
解决办法:需要修改为系统的[UIFont systemFontOfSize:font];
3.系统自带UIAlertController弹出延迟问题
解决办法:可使用回到主线程进行弹出,有效避免系统弹框延迟问题dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:alert animated:true completion:nil];});
4.WKWebView上使用自定义UIMenuController
小伙伴们可以测试一下,WKWebView正常情况下是无法取消掉系统自带的复制,粘贴,全选等选项的
如果当前WKWebView中没有弹出键盘需求的话可直接使用以下办法弹出自定义按钮
- (BOOL)canResignFirstResponder{if (_dismissSelf) {return YES;}return NO;
}- (void)viewWillDisappear:(BOOL)animated{[super viewWillDisappear:animated];self.dismissSelf = YES;
}- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];self.dismissSelf = NO;
}
@warning _dismissSelf 这个布尔值的意义在为NO时,可展示自定义的UIMenuItem,
但是- (BOOL)canResignFirstResponder这个函数返回是全局都做修改的。
如果退出当前界面还是为NO的话,那么我们项目中所有的键盘弹出将不起作用
5.UISearchBar相关问题

EC94CE76-CD0A-4DE7-A6E0-608A041A1B6A.png

-(UISearchBar *)poiSearchBar{if (!_poiSearchBar) {_poiSearchBar = [[UISearchBar alloc]init];_poiSearchBar.backgroundImage = [[UIImage alloc]init];_poiSearchBar.barTintColor = [UIColor uiColorFromString:@"#f0f3f8"];_poiSearchBar.placeholder = @"请输入检索信息";_poiSearchBar.delegate = self;_poiSearchBar.barStyle = UIBarStyleDefault;_poiSearchBar.tintColor = [UIColor redColor];[_poiSearchBar setImage:[UIImage imageNamed:@"search_Icon"] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];// 设置圆角和边框颜色UITextField * searchF = [_poiSearchBar valueForKey:@"searchField"];// KVO获取私有变量if (searchF) {[searchF setBackgroundColor:[UIColor  uiColorFromString:@"#f0f3f8"]];[searchF setValue:[UIFont boldSystemFontOfSize:13] forKeyPath:@"_placeholderLabel.font"];//KVCsearchF.returnKeyType = UIReturnKeySearch;searchF.layer.cornerRadius = 5;searchF.layer.borderWidth = 1;searchF.layer.borderColor = [UIColor redColor].CGColor;searchF.layer.masksToBounds = YES;[searchF setTintColor:[UIColor uiColorFromString:@"#1997eb"]];}}return _poiSearchBar;}
搜索框上取消按钮-(void)searBarText:(UISearchBar*)searchBar{searchBar.showsCancelButton = YES;for (UIView * view in [[[searchBar subviews] objectAtIndex:0] subviews]) {if ([view isKindOfClass:[NSClassFromString(@"UINavigationButton")class]]) {UIButton * cancle = (UIButton *)view;cancle.hidden = NO;[cancle setTitle:@"取消" forState:UIControlStateNormal];[cancle setTitleColor:[UIColor uiColorFromString:@"#f0f3f8"] forState:UIControlStateNormal];cancle.enabled = YES;//系统默认为NO.为了达到没有输入文字直接点击取消可以返回之前的界面。而不是第一次点击取消会获取焦点走searchBarTextDidBeginEditing方法 。需要在找到取消按钮的时候设置为YEScancle.titleLabel.font = [UIFont systemFontOfSize:15];[cancle addTarget:self action:@selector(cancleButton:) forControlEvents:UIControlEventTouchUpInside];}}}
UISearchBar解析
(1)改变背景色
找到_searchbar.subviews 数组中的第一个view。自定义一个view添加背景色放在上变
(2)不显示背景色
样式中(searchBarStyle)选择 UISearchBarStyleMinimal //不显示背景色
(3)改变输入框的圆角
找到textfield  UITextfield * textF = [_searchBar valueForKey:”searchField”]navBo如果存在改变圆角。
(4)改变提示字体的大小
利用KVC 实现改变提示字体的大小
[_textfield setValue:[UIFont boldSystemFontOfSize:字体大小]
6.消除头部停留
-(void)scrollViewDidScroll:(UIScrollView*)scrollerView{CGFloat section = 区头高度if(scrollView.contentOffset.y < section && scrollView.contentOffset.y >0){scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y,0,0,0)}else if {scrollView.contentInset = UIEdgeInsetMake(-section,0,0,0)}}
7.多个字符串拼接(举例以逗号拼接)
NSArray *strs = [@"a", @"b", @"c"];NSString *string = [strs componentsJoinedByString:@","];
8.多个字符串(单个)分隔 (举例以逗号分隔)
NSString *a = [[NSString alloc] initWithString : @"冬瓜,西瓜,火龙果,大头,小狗" ];NSArray *b = [a componentsSeparatedByString:@","];
9.截取字符串
- (NSString *)substringFromIndex:(NSUInteger)from; 从哪个位置其到尾
- (NSString *)substringToIndex:(NSUInteger)to; 从开头到哪个位置
- (NSString *)substringWithRange:(NSRange)range;  从哪到哪之间的位置
10.分隔指定字符串
NSArray *resultArr1 =     [stringcomponentsSeparatedByString:@"_"];
11.替换某一个字符串
NSString * string=@"2011-11-29";
string=[string stringByReplacingOccurrencesOfString:@"-"withString:@"/"]; 
结果: 2011/11/29
12.添加中划线
NSString *textStr = [NSString stringWithFormat:@"%@元", primeCost];//中划线NSDictionary *attribtDic = @{NSStrikethroughStyleAttributeName: [NSNumber numberWithInteger:NSUnderlineStyleSingle]};NSMutableAttributedString *attribtStr = [[NSMutableAttributedString alloc]initWithString:textStr attributes:attribtDic];// 赋值strikeLabel.attributedText = attribtStr;
13.添加下划线:
NSString *textStr = [NSString stringWithFormat:@"%@元", primeCost];// 下划线NSDictionary *attribtDic = @{NSUnderlineStyleAttributeName: [NSNumber numberWithInteger:NSUnderlineStyleSingle]};NSMutableAttributedString *attribtStr = [[NSMutableAttributedString alloc]initWithString:textStr attributes:attribtDic];//赋值underlineLabel.attributedText = attribtStr;
14.统一收起键盘
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
15.获取APP缓存大小,并清理
- (CGFloat)getCachSize {NSUInteger imageCacheSize = [[SDImageCache sharedImageCache] getSize];//获取自定义缓存大小//用枚举器遍历 一个文件夹的内容//1.获取 文件夹枚举器NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:myCachePath];__block NSUInteger count = 0;//2.遍历for (NSString *fileName in enumerator) {NSString *path = [myCachePath stringByAppendingPathComponent:fileName];NSDictionary *fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];count += fileDict.fileSize;//自定义所有缓存大小}// 得到是字节  转化为MCGFloat totalSize = ((CGFloat)imageCacheSize+count)/1024/1024;return totalSize;
}
13.清理APP缓存
- (void)handleClearView {//删除两部分//1.删除 sd 图片缓存//先清除内存中的图片缓存[[SDImageCache sharedImageCache] clearMemory];//清除磁盘的缓存[[SDImageCache sharedImageCache] clearDisk];//2.删除自己缓存NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];[[NSFileManager defaultManager] removeItemAtPath:myCachePath error:nil];
}
16.交换方法的实现
Class aClass = [self class]; SEL originalSelector = @selector(viewWillAppear:); SEL swizzledSelector = @selector(xxx_viewWillAppear:); Method originalMethod = class_getInstanceMethod(aClass, originalSelector); Method swizzledMethod = class_getInstanceMethod(aClass, swizzledSelector); BOOL didAddMethod = class_addMethod(aClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod) { class_replaceMethod(aClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); }
17.几个常用权限判断
 if ([CLLocationManager authorizationStatus] ==kCLAuthorizationStatusDenied) {NSLog(@"没有定位权限");}AVAuthorizationStatus statusVideo = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];if (statusVideo == AVAuthorizationStatusDenied) {NSLog(@"没有摄像头权限");}//是否有麦克风权限AVAuthorizationStatus statusAudio = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];if (statusAudio == AVAuthorizationStatusDenied) {NSLog(@"没有录音权限");}[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {if (status == PHAuthorizationStatusDenied) {NSLog(@"没有相册权限");}}];
18.升级cocoapods
在终端执行 sudo gem install -n / usr / local / bin cocoapods --pre
19.禁止手机睡眠
[UIApplication sharedApplication].idleTimerDisabled = YES;
20.导入自定义的字体库
1、找到你想用的字体的 ttf 格式,拖入工程
2、在工程的plist中增加一行数组,“Fonts provided by application”
3、为这个key添加一个itemvalue为你刚才导入的ttf文件名
4、直接使用即可:label.font = [UIFont fontWithName:@"你刚才导入的ttf文件名" size:20.0];
21.将tableview滚动到顶部
[tableView setContentOffset:CGPointZero animated:YES];
或者
[tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
22.自定义cell选中背景颜色
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor redColor];
[cell setSelectedBackgroundView:bgColorView];
23.UILabel设置文字描边
子类化UILabel,重写drawTextInRect方法
- (void)drawTextInRect:(CGRect)rect
{CGContextRef c = UIGraphicsGetCurrentContext();// 设置描边宽度CGContextSetLineWidth(c, 1);CGContextSetLineJoin(c, kCGLineJoinRound);CGContextSetTextDrawingMode(c, kCGTextStroke);// 描边颜色self.textColor = [UIColor redColor];[super drawTextInRect:rect];// 文本颜色self.textColor = [UIColor yellowColor];CGContextSetTextDrawingMode(c, kCGTextFill);[super drawTextInRect:rect];
}
24.手机摇一摇功能
1、打开摇一摇功能[UIApplication sharedApplication].applicationSupportsShakeToEdit = YES;
2、让需要摇动的控制器成为第一响应者
[self becomeFirstResponder];
3、实现以下方法// 开始摇动
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
// 取消摇动
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
// 摇动结束
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
25.获取view的坐标在整个window上的位置
// v上的(0, 0)点在toView上的位置
CGPoint point = [v convertPoint:CGPointMake(0, 0) toView:[UIApplication sharedApplication].windows.lastObject];
或者
CGPoint point = [v.superview convertPoint:v.frame.origin toView:[UIApplication sharedApplication].windows.lastObject];
26.在非ViewController的地方弹出UIAlertController对话框
//  最好抽成一个分类
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];
//...
id rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
if([rootViewController isKindOfClass:[UINavigationController class]])
{rootViewController = ((UINavigationController *)rootViewController).viewControllers.firstObject;
}
if([rootViewController isKindOfClass:[UITabBarController class]])
{rootViewController = ((UITabBarController *)rootViewController).selectedViewController;
}
[rootViewController presentViewController:alertController animated:YES completion:nil];
27.设置tableView分割线颜色
[self.tableView setSeparatorColor:[UIColor myColor]];
28.设置tableviewcell分割线顶到头
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {[cell setSeparatorInset:UIEdgeInsetsZero];[cell setLayoutMargins:UIEdgeInsetsZero];cell.preservesSuperviewLayoutMargins = NO;
}- (void)viewDidLayoutSubviews {[self.tableView setSeparatorInset:UIEdgeInsetsZero];[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
29.在状态栏增加网络请求的菊花,类似safari加载网页的时候状态栏菊花
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
30.检查一个rect是否包含一个point
// point是否在rect内
BOOL isContains = CGRectContainsPoint(rect, point);
31.在指定的宽度下,让UILabel自动设置最佳font
自适应宽度
label.adjustsFontSizeToFitWidth = YES;
32.为一个View添加虚线边框
结合使用,效果更佳CAShapeLayer *border = [CAShapeLayer layer];border.strokeColor = [UIColor colorWithRed:67/255.0f green:37/255.0f blue:83/255.0f alpha:1].CGColor;border.fillColor = nil;border.lineDashPattern = @[@4, @2];border.path = [UIBezierPath bezierPathWithRect:view.bounds].CGPath;border.frame = view.bounds;[view.layer addSublayer:border];
33.UITextView中打开或禁用复制,剪切,选择,全选等功能
// 继承UITextView重写这个方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
// 返回NO为禁用,YES为开启// 粘贴if (action == @selector(paste:)) return NO;// 剪切if (action == @selector(cut:)) return NO;// 复制if (action == @selector(copy:)) return NO;// 选择if (action == @selector(select:)) return NO;// 选中全部if (action == @selector(selectAll:)) return NO;// 删除if (action == @selector(delete:)) return NO;// 分享if (action == @selector(share)) return NO;return [super canPerformAction:action withSender:sender];
}

未完待续…

这篇关于OC踩坑指南(不定期更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/748460

相关文章

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

GIS图形库更新2024.8.4-9.9

更多精彩内容请访问 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信:digital_twin123 Cesium 本期发布了1.121 版本。重大新闻,Cesium被Bentley收购。 ✨ 功能和改进 默认启用 MSAA,采样 4 次。若要关闭 MSAA,则可以设置scene.msaaSamples = 1。但是通过比较,发现并没有多大改善。

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.