1. Xcode 修改模板:在此路径中修改相应的模板
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File\ Templates/Source/Cocoa\ Touch\ Class.xctemplate
2. [!] Failed to connect to GitHub to update the CocoaPods/Specs specs repo - Please check if you are offline, or that GitHub is down
Github在不久之前的2018年2月23号移除了一些低加密标准协议,包括TLSv1/TLSv1.1,diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,相关链接在这里:Weak cryptographic standards removed
这就意味着Mac系统对应的openssl也需要更新。升级办法:stackoverflow
$ pod repo remove master
$ pod setup
$ pod install
$ pod install
Setting up CocoaPods master repo
$ /usr/bin/git clone https://github.com/CocoaPods/Specs.git master --progress
Cloning into 'master'...
remote: Counting objects: 2013972, done.
remote: Compressing objects: 100% (424/424), done.
remote: Total 2013972 (delta 185), reused 35 (delta 35), pack-reused 2013484
Receiving objects: 100% (2013972/2013972), 524.06 MiB | 921.00 KiB/s, done.
Resolving deltas: 100% (1128315/1128315), done.
Checking out files: 100% (224716/224716), done.
CocoaPods 1.5.0.beta.1 is available.
To update use: `sudo gem install cocoapods --pre`
[!] This is a test version we'd love you to try.
For more information, see https://blog.cocoapods.org and the CHANGELOG for this version at https://github.com/CocoaPods/CocoaPods/releases/tag/1.5.0.beta.1
2018.8.28 https://gems.ruby-china.org/ 域名更新为 https://gems.ruby-china.com
更新macOS High Sierra 11.3 报错:-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory
$ brew reinstall cocoapods
$ brew install ruby
$ brew link --overwrite cocoapods
ERROR: While executing gem ... (TypeError) no implicit conversion of nil into String
$ sudo gem install cocoapods
Password:
ERROR: While executing gem ... (TypeError)
no implicit conversion of nil into String
$ sudo gem update --system //先更新 Ruby
3. 各种波纹动画
4. collectionView瞧不出的方法
//定义每个Cell的大小
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
CGSize size = CGSizeMake(80,80);
return size;
}
//定义每个Section的四边间距
-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
return UIEdgeInsetsMake(15, 15, 5, 15);//分别为上、左、下、右
}
//这个是两行cell之间的间距(上下行cell的间距)
-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
return 0.8;
}
//两个cell之间的间距(同一行的cell的间距)
-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{
return 0.8;
}
5. 图片
1.拉伸
UIImageView *backImgV = [RJInitViewTool rj_initImageViewWithSuperView:self.contentView];
UIImage *image = [UIImage imageNamed:@"product_detail_pinglun_bg"];
// 左端盖宽度
NSInteger leftCapWidth = image.size.width * 0.5f;
// 顶端盖高度
NSInteger topCapHeight = image.size.height * 0.5f;
// 重新赋值
image = [image stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:topCapHeight];
backImgV.image = image;
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight __TVOS_PROHIBITED;
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets NS_AVAILABLE_IOS(5_0); // create a resizable version of this image. the interior is tiled when drawn.
2.旋转
UIImage *img = [UIImage imageNamed:@"homepage_genggai"];
UIImage *image = [UIImage imageWithCGImage:img.CGImage scale:2.0 orientation:UIImageOrientationRight];
imageView.image = image;
3.改变图片颜色
- (UIImage *)imageWithColor:(UIColor *)color image:(UIImage *)image{
UIGraphicsBeginImageContextWithOptions(image.size, NO, 1);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0, image.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
CGContextClipToMask(context, rect, image.CGImage);
[color setFill];
CGContextFillRect(context, rect);
UIImage*newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
4.View的内容生成一张图片
/*UIGraphicsBeginImageContextWithOptions
CGSize size 区域大小
BOOL opaque 是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES
CGFloat scale 屏幕密度
*/
+(UIImage *)hbsc_imageFromView:(UIView *)view{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, [UIScreen mainScreen].scale);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage*image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
6. UILabel放入图片
UILabel *imageLabel = [UILabel new];
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [UIImage imageNamed:@"product_detail_daijinquan"];
attachment.bounds = CGRectMake(0, 0, 15, 15);
NSAttributedString *attributedString = [NSAttributedString attributedStringWithAttachment:attachment];
imageLabel.attributedText = attributedString;
7. iPhoneX(20 --> 44)
[[UIApplication sharedApplication] statusBarFrame].size.height]
#define KIsiPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
//frame布局
if (@available(iOS 11.0, *)) {
self.view.safeAreaInsets.bottom
}else {
}
//masonry布局
if (@available(iOS 11.0, *)) {
make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom);
} else {
make.bottom.equalTo(self.view);
}
8. UITableview 全局刷新跳动
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
8. 半透明Modal控制器解决方案
方法一
self.view.backgroundColor = [UIColor clearColor];
self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
方法二(基于方法一,解决tabbar跟控制器Modal)
UIViewController *VC = [[UIViewController alloc] init];
VC.userDetailModel = self.userDetailModel;
[[UIApplication sharedApplication].delegate.window.rootViewController presentViewController:VC animated:NO completion:nil];
9. UICollectionViewCell自适应大小
//该方法会出现丢cell的BUG
//layout.estimatedItemSize = CGSizeMake(20, 28);
-(UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes{
UICollectionViewLayoutAttributes *attributes = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
CGRect frame = [self.textButton.titleLabel.text boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, 15) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:[NSDictionary dictionaryWithObjectsAndKeys:kHCFont_26,NSFontAttributeName, nil] context:nil];
frame.size.width = frame.size.width + 20;
frame.size.height = 28;
attributes.frame = frame;
return attributes;
}
//设置每个Cell 的宽高(简单地替换方法)
//layout.itemSize = CGSizeMake(10, 28);
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(nonnull UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(nonnull NSIndexPath *)indexPath{
RJModel *model = self.modelArray[indexPath.row];
CGRect frame = [model.name boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, 15) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:[NSDictionary dictionaryWithObjectsAndKeys:kHCFont_26,NSFontAttributeName, nil] context:nil];
return CGSizeMake(frame.size.width+20, 28);
}
10. UITabBarController配置相关
//TabBarItem添加动画
-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item{
NSInteger index = [self.tabBar.items indexOfObject:item];
if (index != self.indexFlag) {
//执行动画
NSMutableArray *arry = [NSMutableArray array];
for (UIView *btn in self.tabBar.subviews) {
if ([btn isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
[arry addObject:btn]; }}
//添加动画
[[arry[index] layer] addAnimation:[RJCoreTool rj_randomTransform] forKey:nil];
//移除其他tabbar的动画
for (int i = 0; i<arry.count; i++) {
if (i != index) {
[[arry[i] layer] removeAllAnimations];}}
self.indexFlag = index;
}
}
//整体颜色渲染
self.tabBar.tintColor = [UIColor blueColor];
[[UITabBarItem appearance] setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:11]} forState:UIControlStateNormal];
//未选中字体颜色
[[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor randomColor],NSFontAttributeName:[UIFont systemFontOfSize:11]} forState:UIControlStateNormal];
//选中字体颜色
[[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor randomColor],NSFontAttributeName:[UIFont systemFontOfSize:11]} forState:UIControlStateSelected];
self.tabBar.backgroundColor = [UIColor whiteColor];//不设置为半透明
self.tabBar.backgroundImage = [UIImage imageNamed:@"Beautimage14"];
11. UINavigationController配置相关
#import "RJNavigationViewController.h"
@interface RJNavigationViewController ()<UIGestureRecognizerDelegate>
@end
@implementation RJNavigationViewController
-(void)viewDidLoad{
[super viewDidLoad];
// 添加全屏返回手势
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
[self.view addGestureRecognizer:pan];
// 不允许边缘手势触发
self.interactivePopGestureRecognizer.enabled = NO;
// 实现滑动返回功能
pan.delegate = self;
}
#pragma mark - UIGestureRecognizerDelegate
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
return self.childViewControllers.count != 1;
}
+(void)load{
// 修改当前导航控制器下导航条
// 1 appearanceWhenContainedIn:获取某个类下面全局外观,获取RJNavigationViewController所有导航条
UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:self, nil];
// 2 设置导航条标题 变大变宽 => 导航条
bar.titleTextAttributes = @{NSFontAttributeName:[UIFont boldSystemFontOfSize:18]};
// 3 设置导航条背景图片:一定要使用Default
[bar setBackgroundImage:[UIImage imageNamed:@"beaut_1"] forBarMetrics:UIBarMetricsDefault];
[bar setShadowImage:[UIImage new]];
}
// 设置非根控制器返回按钮
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
if (self.childViewControllers.count) {//非根控制器
// 1 创建返回按钮
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.layer.cornerRadius = 10;
button.layer.borderColor = WHITE.CGColor;
button.layer.borderWidth = 1;
[button setTitle:@"← ⚔" forState:UIControlStateNormal];
[button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
// 2 把按钮往左边挪动
[button sizeToFit];
button.contentEdgeInsets = UIEdgeInsetsMake(0, -28, 0, 0);
// 3 覆盖系统返回按钮
viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
viewController.hidesBottomBarWhenPushed = YES;
}
// 4 注意。一定要记得调用super
[super pushViewController:viewController animated:animated];
}
-(void)back{
[self popViewControllerAnimated:YES];
}
@end
12. iOS富文本字符串AttributedString详解
13. UILabel宽度固定, 字体大小自适应
//方法一
self.yueL.adjustsFontSizeToFitWidth = YES;
//方法二 : NS_DEPRECATED_IOS(2_0, 7_0)
CGFloat fontSize;
[self.yueL.text sizeWithFont:[UIFont systemFontOfSize:20]
minFontSize:10.0
actualFontSize:&fontSize
forWidth:200
lineBreakMode:NSLineBreakByWordWrapping];
self.yueL.font = [UIFont systemFontOfSize:fontSize];
14. 计算文字高度
//NS_DEPRECATED_IOS(2_0, 7_0)
[string sizeWithFont:[UIFont systemFontOfSize:12]
constrainedToSize:CGSizeMake(200, CGFLOAT_MAX)
lineBreakMode:NSLineBreakByWordWrapping];
//NS_AVAILABLE(10_11, 7_0)
[string boundingRectWithSize:CGSizeMake(labelWidth, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:font}
context:nil]
15. NSString 和 NSArray相互转化
//将array数组转换为string字符串
NSString *tempString = [array componentsJoinedByString:@","];
//将string字符串转换为array数组
NSArray *tempArray = [string componentsSeparatedByString:@","];
16. tableView顶端图片放大效果
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat offsetY = scrollView.contentOffset.y;
NSLog(@"%@",NSStringFromCGPoint(scrollView.contentOffset));
if (offsetY <= 0) {
self.headerView.frame = CGRectMake(offsetY / 2.0, offsetY, kScreenWidth - offsetY, 266 - offsetY);
}
}
- (UIView *)headerView {
if(!_headerView) {
_headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 266)];
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 266)];
[self.tableView addSubview:_headerView];
}
return _headerView;
}
17 Mac10.13 Pod报错 / Xcode 9.4 更新报错
1、 Xcode 9.4 更新报错
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
解决:$ xcode-select --install
2、 Mac10.13 Pod报错
: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory
解决:
$ brew link --overwrite cocoapods
Error: No such keg: /usr/local/Cellar/cocoapods
$ brew reinstall cocoapods
Error: No such keg: /usr/local/Cellar/cocoapods
jiegegedexiaolingtong:HobayNew yishangyun$ brew reinstall cocoapods
==> Reinstalling cocoapods
==> Downloading https://homebrew.bintray.com/bottles/cocoapods-1.4.0.high_sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring cocoapods-1.4.0.high_sierra.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/pod
Target /usr/local/bin/pod
already exists. You may want to remove it:
rm '/usr/local/bin/pod'
To force the link and overwrite all conflicting files:
brew link --overwrite cocoapods
To list all files that would be deleted:
brew link --overwrite --dry-run cocoapods
Possible conflicting files are:
/usr/local/bin/pod
/usr/local/bin/xcodeproj
==> Summary
🍺 /usr/local/Cellar/cocoapods/1.4.0: 8,818 files, 13.0MB
//$ brew install ruby可省略该命令
$ brew link --overwrite cocoapods
Linking /usr/local/Cellar/cocoapods/1.4.0... 2 symlinks created
18 四舍五入保留两位小数
-(float)roundFloat:(float)price{
CGFloat myF = floor(price*10000)/10000;
return (floorf(myF*100 + 0.5))/100;
}
19 启动界面隐藏状态栏
20 设备静音模式下设置播放音
[AVAudioSession sharedInstance]
/* set session category */
- (BOOL)setCategory:(AVAudioSessionCategory)category error:(NSError **)outError API_AVAILABLE(ios(3.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
#pragma mark -- Values for the category property --
/* Use this category for background sounds such as rain, car engine noise, etc.
Mixes with other music. */
extern AVAudioSessionCategory const AVAudioSessionCategoryAmbient API_AVAILABLE(ios(3.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
/* Use this category for background sounds. Other music will stop playing. */
extern AVAudioSessionCategory const AVAudioSessionCategorySoloAmbient API_AVAILABLE(ios(3.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
/* Use this category for music tracks.*/
extern AVAudioSessionCategory const AVAudioSessionCategoryPlayback API_AVAILABLE(ios(3.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
/* Use this category when recording audio. */
extern AVAudioSessionCategory const AVAudioSessionCategoryRecord API_AVAILABLE(ios(3.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
/* Use this category when recording and playing back audio. */
extern AVAudioSessionCategory const AVAudioSessionCategoryPlayAndRecord API_AVAILABLE(ios(3.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
/* Use this category when using a hardware codec or signal processor while
not playing or recording audio. */
extern AVAudioSessionCategory const AVAudioSessionCategoryAudioProcessing API_DEPRECATED("No longer supported", ios(3.0, 10.0)) API_UNAVAILABLE(watchos, tvos) API_UNAVAILABLE(macos);
/* Use this category to customize the usage of available audio accessories and built-in audio hardware.
For example, this category provides an application with the ability to use an available USB output
and headphone output simultaneously for separate, distinct streams of audio data. Use of
this category by an application requires a more detailed knowledge of, and interaction with,
the capabilities of the available audio routes. May be used for input, output, or both.
Note that not all output types and output combinations are eligible for multi-route. Input is limited
to the last-in input port. Eligible inputs consist of the following:
AVAudioSessionPortUSBAudio, AVAudioSessionPortHeadsetMic, and AVAudioSessionPortBuiltInMic.
Eligible outputs consist of the following:
AVAudioSessionPortUSBAudio, AVAudioSessionPortLineOut, AVAudioSessionPortHeadphones, AVAudioSessionPortHDMI,
and AVAudioSessionPortBuiltInSpeaker.
Note that AVAudioSessionPortBuiltInSpeaker is only allowed to be used when there are no other eligible
outputs connected. */
extern AVAudioSessionCategory const AVAudioSessionCategoryMultiRoute API_AVAILABLE(ios(6.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
21-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: bad interpreter: No such file or directory
上述问题是本人升级了Mac的系统导致的,
当你的Mac系统升级为 high sierra 的时候,
别忘记更新cocoapods。执行命令为:
$ sudo gem update --system
$ sudo gem install cocoapods -n/usr/local/bin