IOS一些小技巧(2)

如何检测应用更新?

你可以使用友盟等第三方工具,但如果你只想使用轻量级的方法,只需GET这个接口:http://itunes.apple.com/lookup?id=你的应用程序的ID,解析返回的json字符串就行。

我想完全复制一个 UIView 怎么办,copy 方法好像用不了

iOS 中并不是所有对象都支持copy,只有遵守NSCopying协议的类才可以发送copy消息,当用你试图使用类似于UIView *v = [_v1 copy]方式复制一个UIView时,会抛出一个名为Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView copyWithZone:]: unrecognized selector sent to instance 0x7ff163d12060'的异常。这时候我们可以采取使用对象序列化方式复制对象:

1
2
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_v1];
UIView *v = [NSKeyedUnarchiver unarchiveObjectWithData:data];

如何检测音频蓝牙是否连接

有个小技巧,检测一下当前音频外设是否为 BluetoothA2DPOutput 即可。

1
2
3
4
AVAudioSessionPortDescription *pd = [[AVAudioSession sharedInstance].currentRoute.outputs firstObject];
if ([pd.portType isEqualToString:@"BluetoothA2DPOutput"]) {
// TODO:
}

返回高度固定的 tableviewcell (高性能版)

一般我们用来指定 tableviewcell 的高度时使用 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 方法返回一个固定的高度。但这个方法会被 n 多次调用,其实你只要这么指定下高度就可以 self.tableView.rowHeight = 100

我只是想修改导航栏返回按钮的文字,其他啥都不想干

你可以尝试在 viewWillDisappear 方法里这么干:

项目中静态库有真机和模拟器两个版本,可不可以合并为一个

在 Xcode 中创建一个静态库文件,编译后会生成两个版本,一个是模拟器版本,一个是真机版本。所以导致后续引入静态库非常不方便,因此很有必要把这两个库打包成一个。合并以后的静态库文件大小是未合并的两个静态库之和。方法如下:

bash
1 lipo -create "path/to/模拟器专用lib.a" "path/to/真机专用lib.a" -output "path/to/通用lib.a"

我需要一个完全透明的导航栏

So easy.

1
2
3
/// *** 这两段代码可以把导航栏变透明
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
UINavigationBar.appearance().shadowImage = UIImage() /// 这个是去除导航栏底部的黑色线条

直接使用 16 进制颜色

使用 16 进制颜色相对麻烦一点,在 objc 中你可以定义这样的宏。在 swift 中建议将它改写成 UIColor 的扩展方法

1 #define UIColorHEX(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

tableviewcell 默认的高亮太丑,如何自定义

1
2
3
4
5
cell?.selectedBackgroundView = {
let view = UIView(frame: cell!.contentView.bounds)
view.backgroundColor = UIColor(white: 0.2, alpha: 0.2)
return view
}()

我想让 tableviewcell 的 separator 往左靠近边框,但又不想重写它怎么办

从 iOS 7 开始 tableviewcell 的 separator 遍右移了 27 个像素左右,下面的 3 行代码可以完美解决这个问题。

1
2
3
cell?.separatorInset = UIEdgeInsetsZero
cell?.layoutMargins = UIEdgeInsetsZero
cell?.preservesSuperviewLayoutMargins = false

如何清空其他应用程序在远程控制界面留下的媒体信息

1 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

push/pop 导航栏时有黑影

应该来说这是 iOS 7 中遗留的一个 bug,直到 8.3 发布也没解决。自己的程序中要修复这个问题也很简单,设置一下试图控制器的背景色就可以。

移除导航栏返回按钮的title

1 [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -100) forBarMetrics:UIBarMetricsDefault];

移除subviews

移除 subviews 的常用方法就是遍历 view 中得所有视图依次删除:

1
2
3
for (UIView *items in view.subviews) {
[items removeFromSuperview];
}

其实还有一个方法也能快速删除 subviews 而且比 for 循环好看的多:

objc
1 [view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

不过这个方法只存在于 objc 中。

Build 版本号自动加1

iOS项目开发中有时需要将 build 次数记录下来,在项目的TARGETS->Genneral中修改相应的 Build 选项即可,但是如果在Build Phases中的Run Script中新建这样一个脚本就可以在每次 build 时自动把 build 次数加1:

1
2
3
4
#!/bin/bash
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
 


1.TableView不显示没内容的Cell怎么办?

 

类似于图1,我不想让下面的那些空显示。很简单,添加“self.tableView.tableFooterView = [[UIView alloc] init];”试过都说好,加完这句之后就变成了图2的样子。

 

 

2.自定义了leftBarbuttonItem左滑返回手势失效了怎么办?

 

self.navigationItem.leftBarButtonItem=[[UIBarButtonItemalloc]

initWithImage:img

style:UIBarButtonItemStylePlain

target:self

action:@selector(onBack:)];

self.navigationController.interactivePopGestureRecognizer.delegate=(id<UIGestureRecognizerDelegate>)self;

3.ScrollView莫名其妙不能在viewController划到顶怎么办?

 

self.automaticallyAdjustsScrollViewInsets=NO;

4. 键盘事件写得好烦躁,都想摔键盘了怎么办?

 

●买个结实的键盘;

 

●使用IQKeyboardManager(GitHub上可搜索),用完之后腰也不疼了,腿也不酸了。

 

5.为什么我的App老是不流畅,到底哪里出了问题?

 

如图:

 

这个神器叫做:KMCGeigerCounter,快去GitHub上搬运吧。

 

6.怎么在不新建一个Cell的情况下调整separaLine的位置?

_myTableView.separatorInset=UIEdgeInsetsMake(0,100,0,0);

7.怎么点击self.view就让键盘收起,需要添加一个tapGestures么?

-(void)touchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event

{

[self.viewendEditing:YES];

}

8. 怎么给每个ViewController设定默认的背景图片?

 

使用基类啊,少年。

 

9.想在代码里改在xib里添加的layoutAttributes,但该怎么用代码找?

 

像拉Button一样地拉你的约束,nslayoutattribute也是可以拉线的。

 

10.怎么像Safari一样滑动的时候隐藏navigationbar?

navigationController.hidesBarsOnSwipe=Yes

11. 导航条返回键带的title太讨厌了,怎么让它消失?

[[UIBarButtonItemappearance]setBackButtonTitlePositionAdjustment:UIOffsetMake(0,-60)

forBarMetrics:UIBarMetricsDefault];

12. CoreData用起来好烦,语法又臭又长怎么办?

 

MagicRecord

 

13. CollectionView怎么实现tableview那种悬停的essay-header?

 

CSStickyHeaderFlowLayout

 

14.能不能只用一个pan手势来代替UISwipegesture的各个方向?

 

-(void)pan:(UIPanGestureRecognizer*)sender

{

typedefNS_ENUM(NSUInteger,UIPanGestureRecognizerDirection){

UIPanGestureRecognizerDirectionUndefined,

UIPanGestureRecognizerDirectionUp,

UIPanGestureRecognizerDirectionDown,

UIPanGestureRecognizerDirectionLeft,

UIPanGestureRecognizerDirectionRight

};

staticUIPanGestureRecognizerDirectiondirection=UIPanGestureRecognizerDirectionUndefined;

switch(sender.state){

caseUIGestureRecognizerStateBegan:{

if(direction==UIPanGestureRecognizerDirectionUndefined){

CGPointvelocity=[sendervelocityInView:recognizer.view];

BOOLisVerticalGesture=fabs(velocity.y)>fabs(velocity.x);

if(isVerticalGesture){

if(velocity.y>0){

direction=UIPanGestureRecognizerDirectionDown;

}else{

direction=UIPanGestureRecognizerDirectionUp;

}

}

else{

if(velocity.x>0){

direction=UIPanGestureRecognizerDirectionRight;

}else{

direction=UIPanGestureRecognizerDirectionLeft;

}

}

}

break;

}

caseUIGestureRecognizerStateChanged:{

switch(direction){

caseUIPanGestureRecognizerDirectionUp:{

[selfhandleUpwardsGesture:sender];

break;

}

caseUIPanGestureRecognizerDirectionDown:{

[selfhandleDownwardsGesture:sender];

break;

}

caseUIPanGestureRecognizerDirectionLeft:{

[selfhandleLeftGesture:sender];

break;

}

caseUIPanGestureRecognizerDirectionRight:{

[selfhandleRightGesture:sender];

break;

}

default:{

break;

}

}

break;

}

caseUIGestureRecognizerStateEnded:{

direction=UIPanGestureRecognizerDirectionUndefined;

break;

}

default:

break;

}

}

15. 拉伸图片的时候怎么才能让图片不变形?

 

方法一:

UIImage*image=[[UIImageimageNamed:@"xxx"]stretchableImageWithLeftCapWidth:10topCapHeight:10

注:有开发者提醒这个已经弃用,现在的方法叫resizableImageWithCapInsets。

 

方法二,如图:

 

16.怎么播放GIF的时候这么卡,有没有好点的库?

 

FlipBoard出品的FLAnimatedImage太适合你了。

 

17.怎么一句话添加上拉刷新?

 

使用SVPullToRefresh库:

[tableViewaddPullToRefreshWithActionHandler:^{

//prependdatatodataSource,insertcellsattopoftableview

//call[tableView.pullToRefreshViewstopAnimating]whendone

}position:SVPullToRefreshPositionBottom];

18. 怎么把tableview里Cell的小对勾颜色改成别的颜色?

 

19. 本来我的statusbar是lightcontent的,结果用UIImagePickerController会导致我的statusbar的样式变成黑色,怎么办?

-(void)navigationController:(UINavigationController*)navigationControllerwillShowViewController:(UIViewController*)viewControlleranimated:(BOOL)animated

{

[[UIApplicationsharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];

}

20. 怎么把我的navigationbar弄成透明的而不是带模糊的效果?

[self.navigationBarsetBackgroundImage:[UIImagenew]

forBarMetrics:UIBarMetricsDefault];

self.navigationBar.shadowImage=[UIImagenew];

self.navigationBar.translucent=YES;

21. 怎么改变uitextfield placeholder的颜色和位置?

 

继承uitextfield,重写这个方法:

-(void)drawPlaceholderInRect:(CGRect)rect{

[[UIColorblueColor]setFill];

[self.placeholderdrawInRect:rectwithFont:self.fontlineBreakMode:UILineBreakModeTailTruncationalignment:self.textAlignment];

}

 

1、更加强大的Log输出

#define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), PRETTY_FUNCTIONLINE, ##VA_ARGS);

NSInteger numberA = 100;DLog(@"numberA is %ld",numberA);NSArray *arrayA = @[@"A",@"B",@"C"];DLog(@"arrayA is %@",arrayA);

效果图
打印的内容包括所在的类,所在的方法,所在行数。

2、布局时候使用CGRectInset,设置左右、上下边距

UIView *blackView = [[UIView alloc] initWithFrame:CGRectInset(self.view.bounds, 10,30)];blackView.backgroundColor = [UIColor blackColor];[self.view addSubview:blackView];

左右边距10、上下边距30

3、CFAbsoluteTimeGetCurrent()计算时间差

NSTimeInterval startTime = CFAbsoluteTimeGetCurrent();NSURL *url = [NSURLURLWithString:@"http://m.weather.com.cn/atad/101280601.html"];NSData *data = [NSDatadataWithContentsOfURL:url];DLog(@"data is %@",data);NSTimeInterval endTime = CFAbsoluteTimeGetCurrent();DLog(@"time gap is %f",endTime - startTime);

在主线程处理数据花了18.27秒,醉了

posted @ 2016-05-30 18:08  蜗牛才是大牛  阅读(420)  评论(0编辑  收藏  举报