• 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秒,醉了

  • 相关阅读:
    Codeforces Round #650 (Div. 3)
    C. Count Triangles
    A National Pandemic (思维 + 树链剖分模版)
    扫描线专题
    扫描线模版
    莫队模版
    JS设计模式 -- 4种创建型模式
    滑动窗口的最大值 -- 单调队列
    JS链表实现栈和队列
    js数组扁平化的几种实现方式
  • 原文地址:https://www.cnblogs.com/yangqinglong/p/5543467.html
Copyright © 2020-2023  润新知