ios开发一些小技巧(持续更新)

1、隐藏导航栏的正确姿势

套路一:在viewWillAppearviewWillDisappear方法里面用动画方式设置是否隐藏NavigationBar

- (void)viewWillAppear:(BOOL)animated {
   [super viewWillAppear:animated];
   [self.navigationController setNavigationBarHidden:YES animated:YES];
}
- (void)viewWillDisappear:(BOOL)animated { 
  [super viewWillDisappear:animated];
  [self.navigationController setNavigationBarHidden:NO animated:YES];
}

套路二:设置self为导航控制器的代理,实现代理方法,在将要显示控制器中设置导航栏隐藏和显示,使用这种方式不仅完美切合滑动返回手势,同时也解决了切换tabBar的时候,导航栏动态隐藏的问题.

- (void)viewDidLoad { 
  [super viewDidLoad]; // 设置导航控制器的代理为
  self self.navigationController.delegate = self;
}
#pragma mark - UINavigationControllerDelegate// 将要显示控制器
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
  // 判断要显示的控制器是否是自己 
  BOOL isShowHomePage = [viewController isKindOfClass:[self class]]; 
  [self.navigationController setNavigationBarHidden:isShowHomePage animated:YES];
}

2、设置图片的圆角

设置圆角,我们也许会这么做

self.iconImage.layer.masksToBounds = YES;
self.iconImage.layer.cornerRadius = 20;

如果只是设置一张图片的话,这样的设置对内存没什么大影响,如果是在一个TableView里面的,每个cell都有这样的圆角设置,就会因为使用图层过量而造成卡顿现象!


可用以下套路避免卡顿,可把这个方法单独放到分类中使用

- (UIImage *)cutCircleImage {
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);
    // 获取上下文
    CGContextRef ctr = UIGraphicsGetCurrentContext();
    // 设置圆形
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    CGContextAddEllipseInRect(ctr, rect);
    // 裁剪
    CGContextClip(ctr);
    // 将图片画上去
    [self drawInRect:rect];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

3、以当前时间为基准进行时间的增减

以当前时间为基准进行时间的增减

 *  增减时间(以当前时间为基准)
 *
 *  @param year  1为1年以后的日期 -1为年之前的日期 0为今年
 *  @param month 1为1个月以后的日期 -1为一个月之前的日期 0为本月
 *  @param day   1为1天以后的日期 -1为一天之前的日期 0为今天
 *
 *  @return 时间字符串
 */
+(NSString*)getPastORFutureDateWithYear:(int)year month:(int)month day:(int)day
 {
     NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
     NSDateComponents *comps = nil;
     comps = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]];
     NSDateComponents *adcomps = [[NSDateComponents alloc] init];
     [adcomps setYear:year];
     [adcomps setMonth:month];
     [adcomps setDay:day];
     NSDate *newdate = [calendar dateByAddingComponents:adcomps toDate:[NSDate date] options:0];
     NSDateFormatter *formatter =  [[NSDateFormatter alloc] init];
     [formatter setDateFormat:@"yyyy-MM-dd"];
     NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/beijing"];
     [formatter setTimeZone:timeZone];
     NSString *dateFromData = [formatter stringFromDate:newdate];
     return dateFromData;
 }

4、跳转到系统应用的URL

通过[[UIApplication sharedApplication] openURL:url]来实现跳转系统的应用

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if ([[UIApplication sharedApplication] canOpenURL:url]) 
{ 
    [[UIApplication sharedApplication] openURL:url];
}

常用的跳转URL还有以下
About — prefs:root=General&path=About Accessibility — prefs:root=General&path=ACCESSIBILITY AirplaneModeOn— prefs:root=AIRPLANE_MODE Auto-Lock — prefs:root=General&path=AUTOLOCK Brightness — prefs:root=Brightness Bluetooth — prefs:root=General&path=Bluetooth Date& Time — prefs:root=General&path=DATE_AND_TIME FaceTime — prefs:root=FACETIME General— prefs:root=General Keyboard — prefs:root=General&path=Keyboard iCloud — prefs:root=CASTLE iCloud Storage & Backup — prefs:root=CASTLE&path=STORAGE_AND_BACKUP International — prefs:root=General&path=INTERNATIONAL Location Services — prefs:root=LOCATION_SERVICES Music — prefs:root=MUSIC Music Equalizer — prefs:root=MUSIC&path=EQ Music VolumeLimit— prefs:root=MUSIC&path=VolumeLimit Network — prefs:root=General&path=Network Nike + iPod — prefs:root=NIKE_PLUS_IPOD Notes — prefs:root=NOTES Notification — prefs:root=NOTIFICATIONS_ID Phone — prefs:root=Phone Photos — prefs:root=Photos Profile — prefs:root=General&path=ManagedConfigurationList Reset — prefs:root=General&path=Reset Safari — prefs:root=Safari Siri — prefs:root=General&path=Assistant Sounds — prefs:root=Sounds SoftwareUpdate— prefs:root=General&path=SOFTWARE_UPDATE_LINK Store — prefs:root=STORE Twitter — prefs:root=TWITTER Usage — prefs:root=General&path=USAGE VPN — prefs:root=General&path=Network/VPN Wallpaper — prefs:root=Wallpaper Wi-Fi — prefs:root=WIFI Setting—prefs:root=INTERNET_TETHERING

5、CollectionView相关:

自定义layout的三个步骤(流水布局):
一、准备数据,并保存到布局对象数组

- (void)prepareLayout{ 
  [super prepareLayout]; 
  //准备item的数据  
  //定义数组用来保存每个item的frame 
  NSMutableArray* marr = [NSMutableArray array]; 
  //给每个item布局  
  for (int i = 0; i < self.clothesInfos.count; i ++) { 
  //创建布局对象  
    NSIndexPath* indexPath = [NSIndexPath indexPathForRow:i     inSection:0];
    UICollectionViewLayoutAttributes* attr =     [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 
    //取出数据  
    ClothesModel* model = self.clothesInfos[i]; 
    //计算frame 
    attr.frame = CGRectMake(itemX, itemY, itemWidth, itemHeight); //保存数据  [marr addObject:attr]; 
}
   //计算footView的frame 
  NSIndexPath* footPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
  UICollectionViewLayoutAttributes* footAtt = [UICollectionViewLayoutAttributes   layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionFooter withIndexPath:footPath]; 
  footAtt.frame = CGRectMake(footX, footY, footW, footH); 
  [marr addObject:footAtt]; 
// 把数据保存到布局数组    
  self.layoutAttributeMarr = marr;
}

二、计算内容区域

- (CGSize)collectionViewContentSize{ 
  CGFloat CVCWidth = [UIScreen  mainScreen].bounds.size.width;       UICollectionViewLayoutAttributes* lastAtt = self.layoutAttributeMarr.lastObject;
  CGFloat CVCHeight = CGRectGetMaxY(lastAtt.frame)+_margin;
//根据最大的Y值得到布局内容的高度  
  CGSize CVCSize = CGSizeMake(CVCWidth, CVCHeight); return CVCSize;
}

三、返回布局对象数组

- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{ 
    return self.layoutAttributeMarr;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容