iOS

作者: 山天大畜 | 来源:发表于2016-08-22 15:15 被阅读131次

    资料


    面试


    Tips

    • Swift打印内存地址
    println(" str value \(str) has address: \(unsafeAddressOf(str))")
    
    • Obj-C屏蔽警告
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated-declarations" 
    ...
    #pragma clang diagnostic pop
    
    • 打印代码文件中函数的调用过程
      clang -rewrite-objc xxx.m
      
    • UIWebView获取Html标题
    -(void)webViewDidFinishLoad:(UIWebView *)webView {    
        titleLabel.text = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
    }
    
    • Category添加属性字段
    @interface UIImage (category)
    // 在UIImage中新建一个tag属性
    @property (nonatomic, copy) NSString *tag;
    @end
    
    static const void *tagKey = &tagKey;
    @implementation UIImage (category)
    -(NSString *)tag { 
        return objc_getAssociatedObject(self, tagKey);
    }
    -(void)setTag:(NSString *)tag { 
        objc_setAssociatedObject(self, tagKey, tag, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    @end
    
    • 隐藏状态栏
    override func prefersStatusBarHidden() -> Bool { return true }
    
    • Runloop实现Alert同步弹窗
    -(NSInteger)doModal {
        [self showAlert];
        _bModel = YES;
        while (_bModel) {
          [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        }
        return _selectBtnIndex;
    }
    -(void)showAlert {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" message:@"okookoko" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"ok", nil];
        [alertView show];
    }
    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
        _selectBtnIndex = buttonIndex;
        _bModel = NO;
    }
    
    • UITableView的Group样式下顶部空白处理
    //分组列表头部空白处理
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0.1)];
    self.tableView.tableHeaderView = view;
    
    • 禁止锁屏

    默认情况下,当设备一段时间没有触控动作时,iOS会锁住屏幕。但有一些应用是不需要锁屏的,比如视频播放器。

    [UIApplication sharedApplication].idleTimerDisabled = YES;
    
    • 模态推出透明界面
    UIViewController *vc = [[UIViewController alloc] init];
    UINavigationController *na = [[UINavigationController alloc] initWithRootViewController:vc];
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    {
        na.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    } else {
        self.modalPresentationStyle=UIModalPresentationCurrentContext;
    }
    [self presentViewController:na animated:YES completion:nil];
    
    • Xcode调试不显示内存占用

    editSCheme 里面有个选项叫叫做enable zoombie Objects 取消选中

    • 显示隐藏文件
    //显示
    defaults write com.apple.finder AppleShowAllFiles -bool true
    killall Finder
    //隐藏
    defaults write com.apple.finder AppleShowAllFiles -bool false
    killall Finder
    
    • iOS跳转到App Store下载应用评分
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=APPID"]];
    
    • 手动更改iOS状态栏的颜色
    -(void)setStatusBarBackgroundColor:(UIColor *)color
    {
        UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
        if ([statusBar respondsToSelector:@selector(setBackgroundColor:)])
        {
          statusBar.backgroundColor = color;
        }
    }
    
    • 获取实际使用的LaunchImage图片
    -(NSString *)getLaunchImageName
    {
        CGSize viewSize = self.window.bounds.size;
        // 竖屏
        NSString *viewOrientation = @"Portrait";
        NSString *launchImageName = nil;
        NSArray* imagesDict = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"UILaunchImages"];
        for (NSDictionary* dict in imagesDict)
        {
            CGSize imageSize =     CGSizeFromString(dict[@"UILaunchImageSize"]);
            if (CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]])
            {
                launchImageName = dict[@"UILaunchImageName"];
            }
        }
        return launchImageName;
    }
    
    • 在当前屏幕获取第一响应
    UIWindow * keyWindow = [[UIApplication sharedApplication] keyWindow];
    UIView * firstResponder = [keyWindow performSelector:@selector(firstResponder)];
    
    • 判断对象是否遵循了某协议
    if ([self.selectedController conformsToProtocol:@protocol(RefreshPtotocol)])
    {
        [self.selectedController performSelector:@selector(onTriggerRefresh)];
    }
    
    • 判断view是不是指定视图的子视图
    BOOL isView = [textView isDescendantOfView:self.view];
    
    • NSArray 快速求总和 最大值 最小值 和 平均值
    NSArray *array = [NSArray arrayWithObjects:@"2.0", @"2.3", @"3.0", @"4.0", @"10", nil];
    CGFloat sum = [[array valueForKeyPath:@"@sum.floatValue"] floatValue];
    CGFloat avg = [[array valueForKeyPath:@"@avg.floatValue"] floatValue];
    CGFloat max =[[array valueForKeyPath:@"@max.floatValue"] floatValue];
    CGFloat min =[[array valueForKeyPath:@"@min.floatValue"] floatValue];
    NSLog(@"%f\n%f\n%f\n%f",sum,avg,max,min);
    
    • 修改UITextField中Placeholder的文字颜色
    [textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
    
    • 关于NSDateFormatter的格式
    G: 公元时代,例如AD公元
    yy: 年的后2位
    yyyy: 完整年
    MM: 月,显示为1-12
    MMM: 月,显示为英文月份简写,如 Jan
    MMMM: 月,显示为英文月份全称,如 Janualy
    dd: 日,2位数表示,如02
    d: 日,1-2位显示,如 2
    EEE: 简写星期几,如Sun
    EEEE: 全写星期几,如Sunday
    aa: 上下午,AM/PM
    H: 时,24小时制,0-23
    K:时,12小时制,0-11
    m: 分,1-2位
    mm: 分,2位
    s: 秒,1-2位
    ss: 秒,2位
    S: 毫秒
    
    • 获取一个类的所有子类
    +(NSArray *) allSubclasses
    {
        Class myClass = [self class];
        NSMutableArray *mySubclasses = [NSMutableArray array];
        unsigned int numOfClasses;
        Class *classes = objc_copyClassList(&numOfClasses;);
        for (unsigned int ci = 0; ci < numOfClasses; ci++)
        {
            Class superClass = classes[ci];
            do{
                superClass = class_getSuperclass(superClass);
            } while (superClass && superClass != myClass);
            if (superClass)
            {
                [mySubclasses addObject: classes[ci]];
            }
        }
        free(classes);
        return mySubclasses;
    }
    
    • 监测设备是否设置了代理,需要CFNetwork.framework
    NSDictionary *proxySettings = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings());
    NSArray *proxies = (__bridge NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:@"http://www.baidu.com"]), (__bridge CFDictionaryRef _Nonnull)(proxySettings)));
    NSLog(@"\n%@",proxies);
    NSDictionary *settings = proxies[0];
    NSLog(@"%@",[settings objectForKey:(NSString *)kCFProxyHostNameKey]);
    NSLog(@"%@",[settings objectForKey:(NSString *)kCFProxyPortNumberKey]);
    NSLog(@"%@",[settings objectForKey:(NSString *)kCFProxyTypeKey]);
    if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"])
    {
    NSLog(@"没代理");
    }
    else
    {
    NSLog(@"设置了代理");
    }
    
    • 取消UICollectionView的隐式动画

    UICollectionView在reloadItems的时候,默认会附加一个隐式的fade动画,有时候很讨厌,尤其是当你的cell是复合cell的情况下(比如cell使用到了UIStackView)。
    下面几种方法都可以帮你去除这些动画

    //方法一
    [UIView performWithoutAnimation:^{
    [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
    }];
    //方法二
    [UIView animateWithDuration:0 animations:^{
    [collectionView performBatchUpdates:^{
    [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
    } completion:nil];
    }];
    //方法三
    [UIView setAnimationsEnabled:NO];
    [self.trackPanel performBatchUpdates:^{
    [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
    } completion:^(BOOL finished) {
    [UIView setAnimationsEnabled:YES];
    }];
    
    • 让Xcode的控制台支持LLDB类型的打印

    打开终端输入三条命令:

    touch ~/.lldbinit
    echo display @import UIKit >> ~/.lldbinit
    echo target stop-hook add -o \"target stop-hook disable\" >> ~/.lldbinit
    
    • CocoaPods pod install/pod update更新慢的问题
    pod install --verbose --no-repo-update
    pod update --verbose --no-repo-update
    如果不加后面的参数,默认会升级CocoaPods的spec仓库,加一个参数可以省略这一步,然后速度就会提升不少
    
    • GCD timer定时器
    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, ^{
        //@"倒计时结束,关闭"
        dispatch_source_cancel(timer);
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    });
    dispatch_resume(timer);
    
    • 禁用UIWebView的默认交互行为
    public func webViewDidFinishLoad(webView: UIWebView) {
            if disableUserSelect { // 禁用用户选择
              webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitUserSelect='none';")
            }
            if disableLongTouch { // 禁用长按弹出框
              webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitTouchCallout='none';")
            }
    }
    
    • UIButton 移除所有事件
    button.removeTarget(nil, action: nil, forControlEvents: .AllEvents)
    
    • 在模拟器中添加视频
    //Add a video in Simulator
    if let a = NSBundle.mainBundle().pathForResource("test", ofType: "mov", inDirectory: nil) {
        UISaveVideoAtPathToSavedPhotosAlbum(a, self, nil, nil)
    }
    
    • 液晶时钟字体
    label.font=[UIFont fontWithName:@"DBLCDTempBlack" size:60.0];
    
    • UIAlertController改变按钮文字颜色
    alertC.view.tintColor = your color;
    //setting the tintColor after presenting the controller works on both iOS 8 and 9
    

    问题集锦

    • Can't add self as subview

    iOS7刚发布的时候,总是出现这个 Can't add self as subview 的崩溃,异常描述和崩溃堆栈是这样的:

    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't add self as subview' 
    

    这是因为导航栏在做动画的时候,执行了一次[self addSubView:self]
    为了防止这种情况,我们在UINavigationController基类中加入防御,具体做法是在push,pop方法中设置一个标志位(animating=YES),在动画结束之后,再重置这个标志位,然后,用这个标志位判断push和pop操作是否能够执行。

    @interface UIViewController (Animating)
    @property (nonatomic, assign) BOOL animating;
    @end
    
    @implementation BaseNavigationController
    -(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
        if (topVC.animating) {
            return;
        }
        topVC.animating = YES;
        viewController.animating = YES;
        [super pushViewController:viewController animated:animated];
    }
    @end
    
    @implementation BaseKitViewController
    -(void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
        self.animating = NO;
    }
    -(void)viewDidDisappear:(BOOL)animated {
        [super viewDidDisappear:animated];
        self.animating = NO;
    }
    @end
    
    • TestFlight上传不成功提示ITSAppUsesNonExemptEncryption

    info.plist添加下面键值对

    <key>ITSAppUsesNonExemptEncryption</key><false/>
    

    相关文章

      网友评论

          本文标题:iOS

          本文链接:https://www.haomeiwen.com/subject/poqgsttx.html