意在記錄一些開發(fā)中遇到的問題和處理方式方法 記錄一些小問題的解決 以鑒需要的人 會長期更新
1、APP icon 在iPhone上可以顯示 但在iPad上顯示不出來
解決方法:在info.plist里刪除CFBundleIcons~ipad 這個Key
iPhone項(xiàng)目在iPad中無法顯示圖標(biāo)解決方法
2酒贬、生成標(biāo)準(zhǔn)的整套iOS App icon 圖片(無alpha通道)
應(yīng)用的圖標(biāo)探熔。遵循 Apple、 Google锭吨、 Microsoft 官方標(biāo)
圖片工廠— 移動應(yīng)用圖標(biāo)生成工具寝受,一鍵生成所有尺寸的應(yīng)用圖標(biāo)
3、Object/Model對象儲存到NSUserDefaults
//序列化對象并儲存
LHPersonModel *personModel = [[LHPersonModel alloc]init];
NSData *personData = [NSKeyedArchiver archivedDataWithRootObject: LHPersonModel];
[[NSUserDefaults standardUserDefaults] setObject:personData forKey:@"KPersonData"];
//取出數(shù)據(jù)并反序列化
NSData *personData = [[NSUserDefaults standardUserDefaults] objectForKey:@"KPersonData"];
LHPersonModel * personModel = [NSKeyedUnarchiver unarchiveObjectWithData:personData];
NSLog(@"Name:%@ Age:%@", personModel.name, @(personModel.age));
4乌助、賬號/密碼/用戶名 去除左右兩側(cè)空格
產(chǎn)品反饋 有用戶前后多輸入空格導(dǎo)致無法登錄 空格肉眼又看不見 so 需要過濾左右空格(中間空格不過濾)讓用戶可以登錄
NSString* str = @" 15910221559@163.com ";
NSString* res = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
5溜在、MKMapvie iOS蘋果系統(tǒng)地圖 獲取比例尺&羅盤 更改其坐標(biāo)(支持iOS11+)
//比例尺
- (void)setMapScaleBarPosition:(CGPoint)mapScaleBarPosition
{
if (@available(iOS 11.0, *)) {
__block MKScaleView * mapScaleView = [self.mapView viewWithTag:11 * 11];
if ( mapScaleView == nil) {
mapScaleView = [MKScaleView scaleViewWithMapView:_mapView];
mapScaleView.scaleVisibility = MKFeatureVisibilityVisible;
mapScaleView.tag = 11 * 11;
mapScaleView.width = 100;
[self.mapView addSubview:mapScaleView];
}
[UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
mapScaleView.origin = mapScaleBarPosition;
} completion:nil];
} else {
// _mapView.showsScale = YES;
// Fallback on earlier versions
}
}
//羅盤
- (void)setMapCompassPosition:(CGPoint)mapCompassPosition
{
if (@available(iOS 11.0, *)) {
MKCompassButton *compass = [MKCompassButton compassButtonWithMapView:(MKMapView *)self.mapView];
compass.compassVisibility = MKFeatureVisibilityAdaptive;
compass.origin = mapCompassPosition;
compass.tag = 12 * 12;
[self.mapView addSubview:compass];
} else {
// _mapView.showsCompass = YES;
// Fallback on earlier versions
}
}
6、百度坐標(biāo)他托、國測局坐標(biāo)掖肋、地球坐標(biāo)之間的互轉(zhuǎn)糾偏
//百度坐標(biāo)轉(zhuǎn)國測局坐標(biāo)
+ (CLLocationCoordinate2D)baiduToGCJ02Tool:(CLLocationCoordinate2D)coodinate
{
double x = coodinate.longitude - 0.0065, y = coodinate.latitude - 0.006;
double z = sqrt(x * x + y * y) - 0.00002 * sin(y * earth_pi);
double theta = atan2(y, x) - 0.000003 * cos(x * earth_pi);
double lon = z * cos(theta);
double lat = z * sin(theta);
return CLLocationCoordinate2DMake(lat, lon);
}
//國測局坐標(biāo)轉(zhuǎn)百度坐標(biāo)
+ (CLLocationCoordinate2D)GCJ02ToBaidu:(CLLocationCoordinate2D)coodinate
{
double x = coodinate.longitude;
double y = coodinate.latitude;
double z = sqrt(x * x + y * y) + 0.00002 * sin(y * earth_pi);
double theta = atan2(y, x) + 0.000003 * cos(x * earth_pi);
double lon = z * cos(theta) + 0.0065;
double lat = z * sin(theta) + 0.006;
return CLLocationCoordinate2DMake(lat, lon);
}
//地球坐標(biāo)轉(zhuǎn)國測局坐標(biāo)
+ (CLLocationCoordinate2D)earthToGCJ02Tool:(CLLocationCoordinate2D)coodinate{
double dLat = [self transformLatWithLon:coodinate.longitude - 105.0 andLat:coodinate.latitude - 35.0];
double dLon = [self transformLonWithLon:coodinate.longitude - 105.0 andLat:coodinate.latitude - 35.0];
double radLat = coodinate.latitude / 180.0 * math_pi;
double magic = sin(radLat);
magic = 1 - de * magic * magic;
double sqrtMagic = sqrt(magic);
dLat = (dLat * 180.0) / ((a * (1 - de)) / (magic * sqrtMagic) * math_pi);
dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * math_pi);
return CLLocationCoordinate2DMake(coodinate.latitude + dLat, coodinate.longitude + dLon);
}
const double math_pi = 3.14159265358979324;
const double earth_pi = 3.14159265358979324 * 3000.0 / 180.0;
const double a = 6378245.0;
const double de = 0.00669342162296594323;
+ (double)transformLatWithLon:(double)x andLat:(double)y
{
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(fabs(x));
ret += (20.0 * sin(6.0 * x * math_pi) + 20.0 * sin(2.0 * x * math_pi)) * 2.0 / 3.0;
ret += (20.0 * sin(y * math_pi) + 40.0 * sin(y / 3.0 * math_pi)) * 2.0 / 3.0;
ret += (160.0 * sin(y / 12.0 * math_pi) + 320 * sin(y * math_pi / 30.0)) * 2.0 / 3.0;
return ret;
}
//國測局坐標(biāo)轉(zhuǎn)地球坐標(biāo)
+ (CLLocationCoordinate2D)GCJ02ToEarthTool:(CLLocationCoordinate2D)coodinate
{
double dLat = [self transformLatWithLon:coodinate.longitude - 105.0 andLat:coodinate.latitude - 35.0];
double dLon = [self transformLonWithLon:coodinate.longitude - 105.0 andLat:coodinate.latitude - 35.0];
double radLat = coodinate.latitude / 180.0 * math_pi;
double magic = sin(radLat);
magic = 1 - de * magic * magic;
double sqrtMagic = sqrt(magic);
dLat = (dLat * 180.0) / ((a * (1 - de)) / (magic * sqrtMagic) * math_pi);
dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * math_pi);
return CLLocationCoordinate2DMake(coodinate.latitude - dLat, coodinate.longitude - dLon);
}
.......
7、iOS 判斷當(dāng)前經(jīng)緯度位置coordinate 是否在中國大陸赏参、中國臺灣志笼、中國香港
8、推薦一個練習(xí)刷算法題的網(wǎng)站 現(xiàn)在也有了中國版 很nice的
9把篓、run-ios React Native 運(yùn)行時報(bào)錯
Found Xcode project AwesomeProject.xcodeproj
xcrun: error: unable to find utility "simctl", not a developer tool or in PATH
Command failed: xcrun simctl list devices
xcrun: error: unable to find utility "simctl", not a developer tool or in PATH
Xcode工具路徑不對 應(yīng)該是你裝過兩個Xcode 或者改過路徑 去Xcode>preferences>Locations command line tools:
10纫溃、React-native 報(bào)錯集合
如果你正在學(xué)習(xí)入門RN 建議可以遇到error可以看一下這篇文章 新手遇到的問題這里都有列舉 還有其他問題可以留言 一起討論
React Native開發(fā)錯誤警告處理總結(jié)
11、APP啟動頁時如何隱藏狀態(tài)欄
在info.plits文件中添加key Status bar is initially hidden = YES
就可以啦
11韧掩、 NSPredicate 謂詞的使用
OC中的謂詞操作是針對于數(shù)組類型的皇耗,他就好比數(shù)據(jù)庫中的查詢操作,數(shù)據(jù)源就是數(shù)組揍很,這樣的好處是我們不需要編寫很多代碼就可以去操作數(shù)組郎楼,同時也起到過濾的作用,我們可以編寫簡單的謂詞語句窒悔,就可以從數(shù)組中過濾出我們想要的數(shù)據(jù)呜袁。非常方便。在Java中是沒有這種技術(shù)的简珠,但是有開源的框架已經(jīng)實(shí)現(xiàn)了此功能阶界。
NSPredicate 謂詞的使用
12虹钮、切圓角的三種方式
切圓角是開發(fā)app過程中經(jīng)常會用到的功能,但是使用不同的方式膘融,性能損耗也會不同芙粱,下面會介紹3種切圓角的方法;其中氧映,方法三的性能相對最好春畔。
方法一:
使用cornerRadius進(jìn)行切圓角,在iOS9之前會產(chǎn)生離屏渲染岛都,比較消耗性能律姨,而之后系統(tǒng)做了優(yōu)化,則不會產(chǎn)生離屏渲染臼疫,但是操作最簡單
iv.layer.cornerRadius = 30;
iv.layer.masksToBounds = YES;
方法二:
利用mask設(shè)置圓角择份,利用的是UIBezierPath和CAShapeLayer來完成
CAShapeLayer *mask1 = [[CAShapeLayer alloc] init];
mask1.opacity = 0.5;
mask1.path = [UIBezierPath bezierPathWithOvalInRect:iv.bounds].CGPath;
iv.layer.mask = mask1;
方法三:
利用CoreGraphics畫一個圓形上下文,然后把圖片繪制上去烫堤,得到一個圓形的圖片荣赶,達(dá)到切圓角的目的。
- (UIImage *)drawCircleImage:(UIImage*)image
{
CGFloat side = MIN(image.size.width, image.size.height);
UIGraphicsBeginImageContextWithOptions(CGSizeMake(side, side), false, [UIScreen mainScreen].scale);
CGContextAddPath(UIGraphicsGetCurrentContext(), [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, side, side)].CGPath);
CGContextClip(UIGraphicsGetCurrentContext());
CGFloat marginX = -(image.size.width - side) * 0.5;
CGFloat marginY = -(image.size.height - side) * 0.5;
[image drawInRect:CGRectMake(marginX, marginY, image.size.width, image.size.height)];
CGContextDrawPath(UIGraphicsGetCurrentContext(), kCGPathFillStroke);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
13鸽斟、 藍(lán)牙項(xiàng)目中遇到打開藍(lán)牙允許“xxx”連接到配件 這個系統(tǒng)提示怎么關(guān)閉 CBCentralManagerOptionShowPowerAlertKey
@{CBCentralManagerOptionShowPowerAlertKey:[NSNumber numberWithBool:NO]}
14讯壶、 iOS12 TableView section header/footer 間隔設(shè)置高度無效添加下面一句 配合使用
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 10.f;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
return [UIView new];
}
15、 XCode10 組件化編譯不更新或運(yùn)行報(bào)錯Multiple commands produce /路徑
Legacy Build System 更改后生效
16湾盗、 NSMutableAttributedString 使用富文本 圖片元素(NSTextAttachment)+ 文字 時不能居中對齊
富文本中使用NSMutableAttributedString 富文本字符串 實(shí)現(xiàn) 圖片 + 文字的Label 時遇到圖片在前時 整個文本不能居中對齊 正常情況下設(shè)置NSMutableParagraphStyle 文本格式就可以實(shí)現(xiàn)對齊效果 如下
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
paragraphStyle.alignment = NSTextAlignmentCenter;
NSMutableAttributedString *mAttStr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ ",insuranceText] attributes:@{NSFontAttributeName: [UIFont f12],
NSForegroundColorAttributeName:[UIColor colorWithHexString:@"BBBBBB"],
NSParagraphStyleAttributeName:paragraphStyle }];
但是遇到圖片在前面時不能對齊 我是這樣處理的 你可以嘗試一下 有更好的方式歡迎在評論中分享
//在字符串前加一個空格占位位
[@" " stringByAppendingString:insuranceText];
//圖片Attachment元素 insert插入1位置 就不會影響paragraphStyle.alignment的使用了
[mAttStr insertAttributedString:Attachment atIndex:1];
17伏蚊、 Xcode 遇到報(bào)錯Error: xib: Encountered an error communicating with IBAgent-iOS.
意思是與Xib通訊錯誤 原因也很莫名其妙 不太清楚怎么造成的 解決方法 command + k / 重啟xocde / 重啟電腦 一步
18、 郵箱/電話號碼簡單的脫密顯示(dah*******@gmail.com)
NSString *account = @"dahuangeya@gmail.com";
NSArray <NSString *>*accounts = [account componentsSeparatedByString:@"@"];
if (accounts.firstObject.length > 3) {
NSString *rangeStr = [accounts.firstObject substringWithRange:NSMakeRange(0, 3)];
NSString *str = [rangeStr stringByPaddingToLength:accounts.firstObject.length
withString:@"*"
startingAtIndex:0];
NSString *encryptionStr = [NSString stringWithFormat:@"%@@%@",str,accounts.lastObject];
NSLog(@"%@",encryptionStr);
//輸出:dah*******@gmail.com
}
19格粪、根據(jù)圖片Url 獲取網(wǎng)絡(luò)圖片尺寸的處理方式 (準(zhǔn)確)
之前有個需求是根據(jù)用戶上傳的圖片鏈接按顯示比例鋪滿排版
常見的處理方式是解析圖片的header信息內(nèi)容格式(png躏吊、jpg、gif等)來獲取圖片尺寸(網(wǎng)上很多就不列舉了) 但有問題是不夠準(zhǔn)確 經(jīng)常會計(jì)算錯誤 導(dǎo)致排版異常 下面這種方式可以準(zhǔn)確的獲取圖片的寬高尺寸
/**
* 根據(jù)圖片url獲取圖片尺寸
*/
+ (CGSize)getImageSizeWithURL:(id)URL{
NSURL * url = nil;
if ([URL isKindOfClass:[NSURL class]]) {
url = URL;
}
if ([URL isKindOfClass:[NSString class]]) {
url = [NSURL URLWithString:URL];
}
if (!URL) {
return CGSizeZero;
}
CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
CGFloat width = 0, height = 0;
if (imageSourceRef) {
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSourceRef, 0, NULL);
if (imageProperties != NULL) {
CFNumberRef widthNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
#if defined(__LP64__) && __LP64__
if (widthNumberRef != NULL) {
CFNumberGetValue(widthNumberRef, kCFNumberFloat64Type, &width);
}
CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
if (heightNumberRef != NULL) {
CFNumberGetValue(heightNumberRef, kCFNumberFloat64Type, &height);
}
#else
if (widthNumberRef != NULL) {
CFNumberGetValue(widthNumberRef, kCFNumberFloat32Type, &width);
}
CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
if (heightNumberRef != NULL) {
CFNumberGetValue(heightNumberRef, kCFNumberFloat32Type, &height);
}
#endif
CFRelease(imageProperties);
}
CFRelease(imageSourceRef);
}
return CGSizeMake(width, height);
}
20帐萎、在iOS 10 裝載UICollectionView / UITableView 的VC頁面在push下級頁面再pop回來事content內(nèi)容被下壓20像素
在iOS10系統(tǒng)中 開發(fā)時遇到push頁面返回后 UICollectionView / UITableView content被下壓20像素 試了下面各種屬性設(shè)置并沒有什么卵用
self.automaticallyAdjustsScrollViewInsets = NO;
self.edgesForExtendedLayout = UIRectEdgeNone;
后來網(wǎng)上有位兄dei貼出來這樣一段代碼
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 0)];
[self.view addSubview:view];
mainTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 75, SCREEN_WIDTH, 60 * 3)];
mainTableView.backgroundColor = [UIColor yellowColor];
mainTableView.dataSource = self;
mainTableView.delegate = self;
[self.view addSubview:mainTableView];
思路清奇~ 試了下問題確實(shí)得以神奇解決 但沒有說明具體原因 猜測是因?yàn)閟afeArea 安全顯示區(qū)域做的一些系統(tǒng)適配 會作用于第一個contentView
嘗試不同的解決方式時 發(fā)現(xiàn)我們的TabBar因?yàn)槭亲远x的 NavBar也是自定義的 所以說都不是使用的系統(tǒng)的控件 當(dāng)我嘗試把VC外用UINavigtionController 包裹一層時也可以解決這個問題 猜測系統(tǒng)在這方面其實(shí)已經(jīng)對自己的控件做了適配 所以我想說的是 不要過度自定義 這些控件完全可以遵循系統(tǒng)的方式來擴(kuò)展
MAC VNC://使用別名連接屏幕共享失敗的問題原因
首先你要確認(rèn)你在偏好設(shè)置->共享->打開屏幕共享 是開啟的 然后檢查一下選項(xiàng)設(shè)置是否正確 在看一下自己的防火墻有沒有開啟 確認(rèn)是同一個局域網(wǎng)
如果你設(shè)置了別名(自定義名稱) 系統(tǒng)會在下方提示你其他用戶可以通過 vnc://LH/ 或通過在“訪達(dá)”邊欄中查找“LH”來訪問您的電腦屏幕比伏。
但這樣有可能還是鏈接不上 是因?yàn)槟愕脑O(shè)置了別名 別人找不到你 這時你可以通過你的網(wǎng)絡(luò)IP來替換別名建立鏈接 打開網(wǎng)絡(luò)偏好設(shè)置 用vnc訪問你的IPvnc://192.168.1.18/
就可以嘗試屏幕共享了
21 iOS 如果讓子視圖View一直保持在最上層顯示
self.tableView.mj_header.layer.zPosition = MAXFLOAT;