iOS实用知识点总结

作者: 小虎哥 | 来源:发表于2016-04-19 23:42 被阅读1473次
    • 添加TextFile时,看不到时记得设置boardStyle属性
    UITextField *textField = [[UITextField alloc] init];
    textField.frame = CGRectMake(50, 40, 120, 40);
    //设置boardStyle属性
    textField.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:textField];
    
    • 当两个或多个控制器的View为父子关系时,那么控制器也一定要为父子关系

    • 设置tableView的组与组间的头部高度和尾部高度,可减小组间的间距

        self.tableView.sectionFooterHeight = 10;
        self.tableView.sectionHeaderHeight = 10;
    
    • tableView的footView的高度问题

    • tableView的footView只需要设置高度

    • 自定义tableView的footView时要记得设置高度,否则没法与用户交互

    • 自定义tableView的footView设置高度后会出现下面无法完全显示的bug,需要重新给footView高度赋值,或者设置footView的contentSize

    • 快速获取沙盒路径NSLog(@"%@", NSTemporaryDirectory());

    • scrollerView自动调整内边距属性 (导航控制器有导航条会有64的内边距)

    //NO不自动调整内边距
    self.automaticallyAdjustsScrollViewInsets = NO;
    
    • layoutIfNeeded setNeedsLayout setNeedsDisplay的使用场景
        //重新刷新自己和子控件的所有内容
        [view layoutIfNeeded];
        //重新排布子控件的frame
        [view setNeedsLayout];
        //重新调用drawRect方法
        [view setNeedsDisplay];
    
    • 简单设置按钮内部文字图片间距的方式
    //contentEdgeInsets:会影响按钮内部的所有内容
    button.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 10);
    //imageEdgeInsets:只影响按钮内部的imageView
    button.imageEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 10);
    //titleEdgeInsets:只影响按钮内部的titleLable
    button.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 10);
    
    • 实现tableView组标题不悬浮效果
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        if (scrollView == self.tableView)
        {
            CGFloat sectionHeaderHeight = 25; //sectionHeaderHeight
            if (scrollView.contentOffset.y <= sectionHeaderHeight&&scrollView.contentOffset.y >= 0) {
                scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
            } else if (scrollView.contentOffset.y >= sectionHeaderHeight) {
                scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
            }
        }
    }
    
    • 实现UICollectionView组头、尾标题悬浮效果
    sectionHeadersPinToVisibleBounds
    sectionFootersPinToVisibleBounds
    
    • 使用 NSUserDefaults 存储自定义对象:需要将自定义类型转换为NSData类型,然后将自定义类型数据存入 NSUserDefaults 中。相关学习

    • 在使用tableview的tableHeaderView时,自定义xib时,会出现位置偏移或者会盖住下面的cell或不会随着tableview的滚动而滚动时等情况,这时候需要对tableHeaderView进行一下包装,先在本控制器添加一个view设置为tableHeaderView,然后将自定义的xib添加到这个view上即可

    • bounds补充:bounds是以自己控件的左上角为原点,bounds的大小就是偏移量content offset的值

    • 通过xib创建cell的时候 xib中在View同一层级出现了其他的控件

    "*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'invalid nib registered for identifier (Cell) - nib must contain exactly one top level object which must be a UITableViewCell instance'"
    
    • 监听textView的return,使其退下键盘
    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
    { 
        if ([text isEqualToString:@"\n"]) {
            [textView resignFirstResponder];
            return NO;
        } 
        return YES;
    }
    
    • 使用xib的IBOutletCollection,数组有可能会无序,需要手动排序,我是对每个控件进行设置tag,然后进行排序
    - (NSArray *)sortedArrayUsingComparator:(NSArray *)array{
        return [array sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
            if ([obj1 tag]< [obj2 tag]) return NSOrderedAscending;
            else if ([obj1 tag] > [obj2 tag]) return NSOrderedDescending;
            else return NSOrderedSame;
        }];
    }
    
    • tableViewCell分隔线
    // 添加分隔线
    -(void)viewDidLayoutSubviews
    {
        if ([self.taskDetailTV respondsToSelector:@selector(setSeparatorInset:)]) {
            [self.taskDetailTV setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];
        }
        
        if ([self.taskDetailTV respondsToSelector:@selector(setLayoutMargins:)]) {
            [self.taskDetailTV setLayoutMargins:UIEdgeInsetsMake(0,0,0,0)];
        }
    }
    
    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
            [cell setSeparatorInset:UIEdgeInsetsZero];
        }
        
        if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
            [cell setLayoutMargins:UIEdgeInsetsZero];
        }
    }
    
    • presentViewController跳转界面有时会有卡顿,需要开个异步线程
     dispatch_async(dispatch_get_main_queue(), ^{
                    [self presentViewController:nextVC animated:NO completion:^{
                    }];
                });
    
    
    • 移除所有子试图
    [self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    
    • tableview在iPad上显示不全问题,如下图:
    Snip20161212_15.png

    解决方案:

      if ([[UIDevice currentDevice].systemVersion doubleValue] >= 9.0)
        {
            self.xxxTableView.cellLayoutMarginsFollowReadableWidth = NO;
        }
    

    不断总结更新,欢迎补充……

    相关文章

      网友评论

      • 西风颂:亲,最后一条在iOS8上怎么适配呢?
      • 秋桐树下:点点滴滴的积累总结,是最好的学习方式,加油!
        小虎哥:@TheRepublic 谢谢:smile:一块努力:smile:
      • 大朋友你好:希望继续
        小虎哥:@大朋友你好 有认为实用的,会继续补充的

      本文标题:iOS实用知识点总结

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