iOS 小知识点记录

1、判断一个点或一个区域是否在某个指定的区域

/* Return true if `point' is contained in `rect', false otherwise. */

CG_EXTERN bool CGRectContainsPoint(CGRect rect, CGPoint point)
    CG_AVAILABLE_STARTING(10.0, 2.0);

/* Return true if `rect2' is contained in `rect1', false otherwise. `rect2'
   is contained in `rect1' if the union of `rect1' and `rect2' is equal to
   `rect1'. */

CG_EXTERN bool CGRectContainsRect(CGRect rect1, CGRect rect2)
    CG_AVAILABLE_STARTING(10.0, 2.0);

2、调整按钮内部imageView的大小

- (CGRect)imageRectForContentRect:(CGRect)contentRect

//去调整按钮内部imageView的大小
//返回按钮内部imageView尺寸位置
//contentRect:当前按钮的尺寸大小.
- (CGRect)imageRectForContentRect:(CGRect)contentRect {
    
    CGFloat w = 40;
    CGFloat h = 45;
    CGFloat x = (contentRect.size.width-w)*0.5;
    CGFloat y = 20;
    
    CGRect rect = CGRectMake(x, y, w, h);
    return rect;
}

3、设置一个按钮内部文字显示不同的文字属性

调用按钮的setAttributedTitle方法,根据range去设置不同位置文字的不同属性。
- (void)setAttributedTitle:(nullable NSAttributedString *)title forState:(UIControlState)state

//普通状态
    NSString *first = @"VIP";
    NSString *second = @"100元";
    NSString *btnString = [NSString stringWithFormat:@"%@\n%@", first, second];
    NSMutableAttributedString *attriStr = [[NSMutableAttributedString alloc] initWithString:btnString];
    NSDictionary *dict = @{NSForegroundColorAttributeName : [UIColor yellowColor],NSFontAttributeName : [UIFont systemFontOfSize:15]};
    NSRange range = NSMakeRange(first.length+1, second.length);
    [attriStr addAttributes:dict range:range];
    button.titleLabel.numberOfLines = 0;
    button.titleLabel.textAlignment = NSTextAlignmentCenter;
    [button setAttributedTitle:attriStr forState:UIControlStateNormal];

4、根据一张大图去裁剪成很多张小图片

CGImageRef __nullable CGImageCreateWithImageInRect( CGImageRef cg_nullable image, CGRect rect)

// 计算裁剪小图片的x坐标
        littleImageX = i * littleImageW;
        // 裁剪小图片并设置
        CGImageRef littleImage = CGImageCreateWithImageInRect(origImage.CGImage, CGRectMake(littleImageX, 0, littleImageW, littleImageH));
        UIImage *littleImageN = [UIImage imageWithCGImage:littleImage];
        [btn setImage:littleImageN forState:UIControlStateNormal];

5、从上下文中清除某个区域

// 在上下文中清除Rect内的内容
        CGContextClearRect(ctx, clearRect);

6、清除形变

self.view.transform = CGAffineTransformIdentity;

7、UIView动画的弹簧效果

Duration:动画的执行时长
delay:动画延时长.
Damping:动画的弹性系数,越小,弹簧效果越明显
initialSpringVelocity:弹簧初始化速度

[UIView animateWithDuration:0.8 delay:0 usingSpringWithDamping:0.1 initialSpringVelocity:0
options:UIViewAnimationOptionCurveLinear animations:^{
//动画执⾏行代码
} completion:^(BOOL finished) { 
//动画完成时调⽤用.
}];

8、获取全局的(整个应用程序)导航条

UINavigationBar *bar = [UINavigationBar appearance];

获取指定类下的导航条,此方法常用在导航条类的+ (void)initialize方法中,对整个app的导航条做一次性的内容设置。

   //获取指定类下的导航条
    UINavigationBar *bar = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[
                                                                                          [self class]
                                                                                          ]
                                                                            ];

9、导航条达到透明的效果

  /*
     设置导航条透明度为0,没有效果,还是原来的样⼦. 原因是因为导航条上面那一块并不直接是导航条,它是导航条里面的⼀个子控件. 所以在这里设置它没有效果,因为系统会生成⼀个半透明的图片.
     
      self.navigationController.navigationBar.alpha = 0.0;
      所以在这里我们可以考虑给它设置一个半透明的图片. 在这里,有一个模式,必须要传默认UIBarMetricsDefault模式. 在这里发现设为nil的时候,也没有效果,那是因为系统它做了⼀层判断,它会判断如果传入的系统图片为空的话,它就会帮你生成一个半透明的图片,设置导航条的背景图片.
     **/
    [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];

10、获取不需要渲染的原始图片

    UIImage *image = [UIImage imageNamed:imageName];
    image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

11、当tap手势和点击事件都存在是,默认手势的优先级更高,Touch不起作用,解决方法

实现UIGestureRecognizerDelegate方法 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

/**
 called before touchesBegan:withEvent: is called on the gesture recognizer for a new touch. return NO to prevent the gesture recognizer from seeing this touch
  在touchesBegan:withEvent:之前调用,手势识别器获取一个新touch,返回NO,不让手势识别器识别该touch

 @return NO:不让手势识别器识别该touch; YES:让手势识别器识别该touch
 */
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    
    if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
        return NO;
    } else {
        return YES;
    }
}

12、更新tableview时自动加一个序列帧动画

//更新数据(当更新tableView时会自动加一个序列帧动画)
    [tableView beginUpdates];
    [tableView endUpdates];

13、nil和NSNull区别

       [NSNull null]; //空对象
         nil //空
         NSNull *null = [NSNull null];
        NSDictionary *dict = @{@"name":@"zhangsan",@"age":[NSNull null]};

持续更行中........

你可能感兴趣的:(iOS 小知识点记录)