这里主要讲一些我在日常开发中用到的一些小的技巧,其实也算不上技巧吧,就是省去一些不必要的代码,或者有的小问题困扰你很久说不行在这里你能找到答案

在UIView的扩展 快速修改frame

在iOS修改view的frame,我们经常需要写一大堆代码,来修改frame中的一个小属性,这里有一个方法,就是直接修改frame的每个值

新建一个category UIView+PPSFrame.h

#import <UIKit/UIKit.h>
@interface UIView (PPSFrame)
@property (assign, nonatomic) CGFloat top;//上 相当于frame.origin.y
@property (assign, nonatomic) CGFloat bottom;//下 相当于frame.size.height + frame.origin.y
@property (assign, nonatomic) CGFloat left;//相当于frame.origin.x
@property (assign, nonatomic) CGFloat right;//相当于frame.origin.x+frame.size.width
@property (assign, nonatomic) CGFloat centerX;
@property (assign, nonatomic) CGFloat centerY;
@property (assign, nonatomic) CGFloat width;
@property (assign, nonatomic) CGFloat height;
@property (assign, nonatomic) CGSize size;
@end

在.m文件中设置各个属性

#import "UIView+Layout.h"
@implementation UIView (Layout)
@dynamic top;
@dynamic bottom;
@dynamic left;
@dynamic right;
@dynamic width;
@dynamic height;
@dynamic size;
- (CGFloat)top
{
return self.frame.origin.y;
}
- (void)setTop:(CGFloat)top
{
CGRect frame = self.frame;
frame.origin.y = top;
self.frame = frame;
}
- (CGFloat)left
{
return self.frame.origin.x;
}
- (void)setLeft:(CGFloat)left
{
CGRect frame = self.frame;
frame.origin.x = left;
self.frame = frame;
}
- (CGFloat)bottom
{
return self.frame.size.height + self.frame.origin.y;
}
- (void)setBottom:(CGFloat)bottom
{
CGRect frame = self.frame;
frame.origin.y = bottom - frame.size.height;
self.frame = frame;
}
- (CGFloat)right
{
return self.frame.size.width + self.frame.origin.x;
}
- (void)setRight:(CGFloat)right
{
CGRect frame = self.frame;
frame.origin.x = right - frame.size.width;
self.frame = frame;
}
- (CGFloat)centerX
{
return self.center.x;
}
- (void)setCenterX:(CGFloat)centerX
{
CGPoint center = self.center;
center.x = centerX;
self.center = center;
}
- (CGFloat)centerY
{
return self.center.y;
}
- (void)setCenterY:(CGFloat)centerY
{
CGPoint center = self.center;
center.y = centerY;
self.center = center;
}
- (CGFloat)width
{
return self.frame.size.width;
}
- (void)setWidth:(CGFloat)width
{
CGRect frame = self.frame;
frame.size.width = width;
self.frame = frame;
}
- (CGFloat)height
{
return self.frame.size.height;
}
- (void)setHeight:(CGFloat)height
{
CGRect frame = self.frame;
frame.size.height = height;
self.frame = frame;
}
- (CGSize)size
{
return self.frame.size;
}
- (void)setSize:(CGSize)size
{
CGRect frame = self.frame;
frame.size = size;
self.frame = frame;
}
@end

iOS OC项目的pch文件使用

在项目中如果我们需要一些公共的引用,或者一些全局的宏 那我们经常在pch中设置好

具体怎么设置呢 在项目下新建一个pch文件

一般我会取名 项目名-PrefixHeader

在target——>Bulid Setting 中 设置 PrefixHeader

我的项目文件夹结构

$(SRCROOT)这个是指工程的根目录

找到这个pch文件就行 然后启动APP就会编译这个文件了

pch.h中

//
// APP-1-PrefixHeader.pch
// APP-1
//
// Created by 羊谦 on 2016/10/28.
// Copyright © 2016年 羊谦. All rights reserved.
//
#ifndef APP_1_PrefixHeader_pch
#define APP_1_PrefixHeader_pch
//在这里直接定义你的宏变量 或者公共引用就行
#endif /* APP_1_PrefixHeader_pch */

UITableView的Group样式下顶部空白处理

要给tableHeaderView赋一个高度不为0的view才能处理顶部留白

//分组列表头部空白处理
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0.1)];
self.tableView.tableHeaderView = view;

获取某个view的Controller

其实就是根据view的响应链,来查找viewcontroller

- (UIViewController *)viewController
{
UIViewController *viewController = nil;
UIResponder *next = self.nextResponder;
while (next)
{
if ([next isKindOfClass:[UIViewController class]])
{
viewController = (UIViewController *)next;
break;
}
next = next.nextResponder;
}
return viewController;
}

清空NSUserDefaults的记录

方法一:是获取当前的app的bundleId NSUserDefaults中有方法根据bundleId清空记录

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

方法二:获取所有存储在NSUserDefaults中的数据,因为是按照key-value形式存储,所以循环key就能够删除数据

- (void)clearDefaults{
NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
NSDictionary * dict = [defs dictionaryRepresentation];
for (id key in dict)
{
[defs removeObjectForKey:key];
}
[defs synchronize];
}

GCD timer定时器的使用

这里的定时器,是一个每秒在主线程跑的一个方法

__block int countSecond = 30; //倒计时
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(timer, ^{
if (countSecond==0) { //倒计时完毕
//@"倒计时结束,关闭"
dispatch_source_cancel(timer);
dispatch_async(dispatch_get_main_queue(), ^{
//倒计时完毕需要执行的操作
});
}else{ //倒计时
NSLog(@"%@", [NSString stringWithFormat:@"%ld",(long)countSecond]);
dispatch_async(dispatch_get_main_queue(), ^{
//每秒需要执行的操作
//在这里更新UI之类的
});
countSecond--;
}
});
dispatch_resume(timer);

计算文件大小

- (long long)fileSizeAtPath:(NSString *)path
{
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:path])
{
long long size = [fileManager attributesOfItemAtPath:path error:nil].fileSize;
return size;
}
return 0;
}

计算文件夹大小

- (long long)folderSizeAtPath:(NSString *)path
{
NSFileManager *fileManager = [NSFileManager defaultManager];
long long folderSize = 0;
if ([fileManager fileExistsAtPath:path])
{
NSArray *childerFiles = [fileManager subpathsAtPath:path];
for (NSString *fileName in childerFiles)
{
NSString *fileAbsolutePath = [path stringByAppendingPathComponent:fileName];
if ([fileManager fileExistsAtPath:fileAbsolutePath])
{
long long size = [fileManager attributesOfItemAtPath:fileAbsolutePath error:nil].fileSize;
folderSize += size;
}
}
}
return folderSize;
}

向上取整和向下取整

floor(x)函数,是一个向下取整函数,是一个C函数 即是去不大于x的一个最大整数
floor(3.12) = 3 floor(4.9) = 4
与floor(x)函数对应的是ceil函数
这个即是向上取整了
ceil(3.9) = 4 ceil(1.2) = 2

给任何一个view设置一张图片

UIImage *image = [UIImage imageNamed:@"image"];
self.MYView.layer.contents = (__bridge id _Nullable)(image.CGImage);
self.MYView.layer.contentsRect = CGRectMake(0, 0, 0.5, 0.5);

iOS基础开发技巧2相关推荐

  1. DELPHI基础开发技巧

    ◇[DELPHI]网络邻居复制文件 uses shellapi; copyfile(pchar('newfile.txt'),pchar('//computername/direction/targe ...

  2. 6种有效的iOS团队开发技巧

    本文有Da杯柠檬水(微博)翻译自Effective Tips for iOS Development Team Carshare HK iOS app是我昔日帮助开发的最精美的一款应用程序.故事开始于 ...

  3. WEBAPP介绍及其iOS Web开发技巧总结

    转:http://blog.csdn.net/freshlover/article/details/10361689 WebApp是一种新出现的基于WEB形式的类应用程序,运行在高端的移动终端设备上, ...

  4. IOS基础开发二(iphone计算器)

    今天做了个iphone的小例子计算器:才用mvc设计模式 项目目录: 代码如下: CalculatorViewController:(MVC的控制器) // CalculatorViewControl ...

  5. 【转】几点 iOS 开发技巧

    [译] 几点 iOS 开发技巧 原文:iOS Programming Architecture and Design Guidelines 原文来自破船的分享 原文作者是开发界中知晓度相当高的 Mug ...

  6. iOS开发系列--IOS程序开发概览ios基础

    iOS开发系列--IOS程序开发概览 概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的I ...

  7. IOS UI开发基础之超级猜图完整版本-08

    IOS UI开发基础之超级猜图完整版本-08 // // ViewController.m // 09-超级猜图 // // Created by 鲁军 on 2021/1/31. //#import ...

  8. 汉诺塔自动解题动画中的iOS开发技巧

    引 前段时间做了一道题,要求实现汉诺塔游戏的自动解题动画: 汉诺塔游戏应该都了解规则: 1.将盘子全部移动到塔C 2.每次只能移动一个圆盘: 3.大盘不能叠在小盘上面. 要求由用户输入盘子的数量,绘制 ...

  9. iOS开发技巧:设置App icon图标及修改应用程序名

    前言 这是iOS开发技巧系列博客的第二篇,本篇主要简单介绍一下如何设置应用程序的icon图标以及修改应用程序名. 设置 icon 首先我们来看看如何设置App icon图标,设置应用程序的icon图标 ...

最新文章

  1. 《敏捷迭代开发:管理者指南》—第2章2.5节渐进开发和自适应开发
  2. Linux 引导过程内幕
  3. maven和gradle中,dependency和plugin的区别
  4. userscript.user.js 文件头
  5. 第一个Ajax.net程序的实现及心得。
  6. PHP框架最低支持PHP版本
  7. 宇视科技android面试_宇视科技软件笔试面试
  8. SWUST OJ(953)
  9. ST 电机库 电机位置环7天冲刺开发
  10. 变分法与最优控制matlab,1987_11变分法与最优控制_10654423.pdf
  11. iPhone所有手机型号屏幕尺寸及H5的CSS适配
  12. 基于SBO的委外加工条码解决方案
  13. 给Testerhome测试小道消息做个硬广告
  14. 多服务器显卡使用状态监控工具实现
  15. openEuler-risc-v学习笔记
  16. 2023-03-06
  17. 在Redhat/Centos上安装和配置TortoiseHg和kdiff3
  18. wifi 小程序 透传_微信小程序实现的一键连接wifi功能示例
  19. XUPT_ACM2021寒假训练第二周练习记录
  20. 外媒:布兰妮歌曲成反恐神器 英海军用其吓退海盗

热门文章

  1. 义嘉泰携手----炬芯蓝牙双模ATS3085 ATS3085C
  2. 不只是好玩,各类顶级声优齐聚,满足你的视听盛宴!
  3. 联想水滴 android,联想首款水滴全面屏!性能与时尚的完美结合,偶像级自拍体验...
  4. 【读书笔记】读书立身修心,重建自我保护 划分亲密领域【被讨厌的勇气-岸见一郎 古贺史健-人文社科/社会科学类】
  5. Java微信小程序奶茶在线预定点单系统 uniapp小程序
  6. 个人计算机采用risc处理器,2013年计算机三级考试PC技术试题及答案解析13
  7. Qt/C++编写可视化大屏电子看板系统6-窗体打开关闭
  8. 南大通用GBase8s 常用SQL语句(258)
  9. MySQL字段类型汇总及用法(超详细)
  10. 计算机与制药工程论文,制药工程论文