iOS实用知识点总结

  • 添加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上显示不全问题,如下图:
iOS实用知识点总结_第1张图片
Snip20161212_15.png

解决方案:

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

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

你可能感兴趣的:(iOS实用知识点总结)