一,UIButton让其文字在图片下方:
[operateBt setTitleEdgeInsets:UIEdgeInsetsMake(operateBt.imageView.frame.size.height+14.0, -operateBt.imageView.frame.size.width, 0.0, 0.0)]; [operateBt setImageEdgeInsets:UIEdgeInsetsMake(0.0, 0.0, 0.0, -operateBt.titleLabel.bounds.size.width)];
二,UIButton用SF符号:
let image = UIImage(named: "record_def_svg") var config = UIImage.SymbolConfiguration(font: systemFontWithSize(ScaleSize(152.0))); if #available(iOS 15.0, *) { config = config.applying(UIImage.SymbolConfiguration(paletteColors: [.white])); }else { image?.withTintColor(.white, renderingMode: .alwaysOriginal); } image?.withTintColor(.white, renderingMode: .alwaysTemplate); recordButton.setImage(image, for: .normal); recordButton.setPreferredSymbolConfiguration(config, forImageIn: .normal);
3,主线程返回一个值:
- (BOOL)isBool { __block BOOL result; if ([NSThread isMainThread]) { return YES; } else { dispatch_sync(dispatch_get_main_queue(), ^{ result = YES; }); } return result; }
4,willMoveToSuperview,view的方法,view即将添加到superview或者即将被移除的时候调用,例如:
- (void)willMoveToSuperview:(UIView *)newSuperview { if(newSuperview != nil){ self.bounds = CGRectMake(0.0, 0.0, self.bounds.size.width, self.collectionViewLayout.collectionViewContentSize.height); } [super willMoveToSuperview:newSuperview]; }
5,UISearchController取消按钮更改其title:
searchController.searchBar.showsCancelButton = true; if let subFirst = searchController.searchBar.subviews.first,searchController.isActive { let searchBarContainerView = subFirst.subviews[1]; for barSuvViews in searchBarContainerView.subviews { if barSuvViews.isKind(of: UIButton.self){ let cancelButton: UIButton = barSuvViews as! UIButton; cancelButton.setTitle("取消", for: .normal); } } }
6,URL格式化和反格式化:
//格式化URL +(NSString *)encodeUrl:(NSString *)sourceURL { if (System_Version_Later(9.0)) { return [sourceURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; }else{ return [sourceURL stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet]; } } //反格式化ULR - (NSString *)decodeUrl:(NSString *)codeURL { if (System_Version_Later(9.0)) { return [codeURL stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; }else{ return [codeURL stringByRemovingPercentEncoding]; } }
七,deviceToken,NSData类型转NSString。
NSString *strToken; //Xcode11打的包,iOS13获取Token有变化 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 13) { if (![deviceToken isKindOfClass:[NSData class]]) { //记录获取token失败的描述 return; } const unsigned *tokenBytes = (const unsigned *)[deviceToken bytes]; strToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x", ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]), ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]), ntohl(tokenBytes[6]), ntohl(tokenBytes[7])]; NSLog(@"deviceToken1:%@", strToken); } else { strToken = [NSString stringWithFormat:@"%@",deviceToken]; strToken = [strToken stringByReplacingOccurrencesOfString:@"<" withString:@""]; strToken = [strToken stringByReplacingOccurrencesOfString:@">" withString:@""]; strToken = [strToken stringByReplacingOccurrencesOfString:@" " withString:@""]; NSLog(@"deviceToken2 is: %@", strToken); }
八,OC自定义struct。
struct Sky_Location { CGFloat top; CGFloat left; CGFloat right; }; typedef struct CG_BOXABLE Sky_Location Sky_Location; CG_INLINE Sky_Location Sky_LocationMake(CGFloat top, CGFloat left, CGFloat right) { Sky_Location location; location.top = top; location.left = left; location.right = right; return location; }
九,自定义View当中,因为使用了延迟调用,例如:
[self performSelector:@selector(countdown) withObject:nil afterDelay:30.0]而导致dealloc不去执行,可在didMoveToSuperview中取消执行selector,可取消引用从而调用dealloc,如下:
//当view加入或离开superview时,调用此方法 - (void)didMoveToSuperview { NSLog(@"didMoveToSuperview"); if(nil == self.superview){ [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(countdown) object:nil]; [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(display) object:nil]; } }
十,模拟数组循环;
- (void)foreachWithOperate:(void( ^ _Nullable)(id _Nonnull object,NSInteger idx,bool *stop))operate { for (NSInteger i = 0; i < self.count - 1; i++) { bool isStop = NO; if(operate) { operate(self[i],i,&isStop); } if(YES == isStop) { break; } } }
十一,以动画的方式刷新tableview。
[UIView transitionWithView:weakSelf.detatilInfoTabView duration: 0.55f options: UIViewAnimationOptionTransitionFlipFromLeft animations: ^(void){ [weakSelf.detatilInfoTabView reloadData]; }completion:^(BOOL finished) { dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf addFooterViewByAD]; }); }];
十二,UITextView加载富文本,其资源文件过大导致卡顿的解决办法。
[NSThread detachNewThreadWithBlock:^{ // NSString *jieShaoDetail = [NSString stringWithFormat:@"<head><style>img{width:%f !important;height:auto}</style></head>%@", (ScreenWidth-ScaleForSize(40.0)*2), detailModel.intro]; NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData:[jieShaoDetail dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType} documentAttributes:nil error:nil]; dispatch_async(dispatch_get_main_queue(), ^{ weakSelf.jieshaoTextView.attributedText = attributedString; [weakSelf.bgScrollView layoutIfNeeded]; weakSelf.bgScrollView.contentSize = CGSizeMake(0.0, weakSelf.yuYueTextView.bottom + ScaleForSize(40.0) + ScaleForSize(100.0)); }); }];
十三,addChildViewController子控制器之后,要修改子控制器的frame,需要如下:
//父控制器中: IMSearchInitPageController *siCtrl = [[IMSearchInitPageController alloc]init]; siCtrl.view.frame = CGRectMake(0.0, naviBarHeight, ScreenWidth, ScreenHeight - naviBarHeight); [self addChildViewController:siCtrl]; [self.view addSubview:siCtrl.view]; //自控制器中修改self.view的大小,重写loadView方法 - 重写self.view - (void)loadView { self.view = [[UIView alloc]initWithFrame:CGRectMake(0.0, 0.0, ScreenWidth, ScreenHeight - navigationBarHeight - 8)]; }
十四,根据父类的宽度进行约束,并且在父类的基础上增加一些数值:
//让其view在父类宽度 * 0.7的基础上,增加navigationDisparityHeight的高度。 [self.coverView mas_makeConstraints:^(MASConstraintMaker *make) { (void)make.top.left.right; make.height.mas_equalTo(self.mas_width).multipliedBy(0.7).offset(navigationDisparityHeight); }];
十五,在不知道宽高确切数值的情况下,约束宽高相同。
[self.imageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(ScaleForLengthWith2(10.0)); make.right.bottom.mas_equalTo(-ScaleForLengthWith2(10.0)); make.width.mas_equalTo(self.imageView.mas_height); }];
十六,获取label的高度:
// CGSize descSize = [self.descLable sizeThatFits:CGSizeMake(ScreenWidth-ScaleForSize(60.0)*2, 0.0)]; //
十七,masonry动画:
// [cateUnfoldView layoutIfNeeded]; // [UIView animateWithDuration:0.2 animations:^{ [cateUnfoldView.cateListView mas_updateConstraints:^(MASConstraintMaker *make) { make.height.mas_equalTo(datas.count*ScaleForSize(70.0)); }]; [cateUnfoldView layoutIfNeeded]; }]; //
十八,UIImage图片翻转;因拍照时,可能导致UIImage90度翻转,需要进行判断且翻转,然后上传到后台使用:
// // UIImage *uploadImage = xxx; if(uploadImage.imageOrientation == UIImageOrientationRight){ UIImage *realImage = [UIImage imageWithCGImage:backImage.image.CGImage scale:backImage.image.scale orientation:UIImageOrientationLeftMirrored]; } if(uploadImage.imageOrientation == UIImageOrientationLeft){ UIImage *realImage = [UIImage imageWithCGImage:backImage.image.CGImage scale:backImage.image.scale orientation:UIImageOrientationRightMirrored]; } //realImage为最终图片 // //
十九,OC中泛型的使用场景:
// // #import <Foundation/Foundation.h> @interface GenericContainer<ObjectType> : NSObject // 存储泛型数据 @property (nonatomic, strong) NSMutableArray<ObjectType> *items; // 添加元素到容器 - (void)addItem:(ObjectType)item; // 获取容器中指定索引的元素 - (ObjectType)itemAtIndex:(NSUInteger)index; // 获取容器中的元素个数 - (NSUInteger)count; // 清空容器 - (void)clear; @end // //
二十,weak对象,解决循环引用问题。
// // MQChatViewController *chatCtrl = [chatViewManager pushMQChatViewControllerInViewController:controller]; //跳转到商品详情,这里解决循环引用 __weak typeof(chatCtrl) weakChatVc = chatCtrl; [chatViewManager didTapProductCard:^(NSString *productUrl) { //doing - weakChatVc }]; // //
二十一,获取UIImage的格式类型。
// // - (NSString *)imageFormatForImageData:(NSData *)imageData { NSString *formatString = @"Unknown"; if (!imageData) { return formatString; } uint8_t c; [imageData getBytes:&c length:1]; switch (c) { case 0xFF: formatString = @"JPEG"; break; case 0x89: formatString = @"PNG"; break; case 0x47: formatString = @"GIF"; break; case 0x49: case 0x4D: formatString = @"TIFF"; break; case 0x52: { if (imageData.length >= 12) { //RIFF....WEBP NSString *testString = [[NSString alloc] initWithData:[imageData subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { formatString = @"WEBP"; } } break; } case 0x00: { if (imageData.length >= 12) { //....ftypheic ....ftypheix ....ftyphevc ....ftyphevx NSString *testString = [[NSString alloc] initWithData:[imageData subdataWithRange:NSMakeRange(4, 8)] encoding:NSASCIIStringEncoding]; if ([testString isEqualToString:@"ftypheic"] || [testString isEqualToString:@"ftypheix"] || [testString isEqualToString:@"ftyphevc"] || [testString isEqualToString:@"ftyphevx"]) { formatString = @"HEIC"; } //....ftypmif1 ....ftypmsf1 if ([testString isEqualToString:@"ftypmif1"] || [testString isEqualToString:@"ftypmsf1"]) { formatString = @"HEIF"; } } break; } case 0x25: { if (imageData.length >= 4) { //%PDF NSString *testString = [[NSString alloc] initWithData:[imageData subdataWithRange:NSMakeRange(1, 3)] encoding:NSASCIIStringEncoding]; if ([testString isEqualToString:@"PDF"]) { formatString = @"PDF"; } } break; } case 0x3C: { // Check end with SVG tag if ([imageData rangeOfData:[@"</svg>" dataUsingEncoding:NSUTF8StringEncoding] options:NSDataSearchBackwards range: NSMakeRange(imageData.length - MIN(100, imageData.length), MIN(100, imageData.length))].location != NSNotFound) { formatString = @"SVG"; } break; } default: formatString = @"Unknown"; } return formatString; } // // 使用1,bundle中的图片: NSString *imageURL = [[NSBundle mainBundle]pathForResource:@"121212" ofType:@"webp"]; NSData *imageData = [NSData dataWithContentsOfFile:imageURL]; NSString *format = [self imageFormatForImageData:imageData]; NSLog(@"%@",format); 使用2,图片选择器中的图片: NSString *url = [info objectForKey:UIImagePickerControllerImageURL]; NSData *imageData = [NSData dataWithContentsOfFile:url]; NSString *format = [self imageFormatForImageData:imageData]; // //