27
2017
09

iOS UIView、UIImageView旋转产生边界锯齿的完美解决方法

在项目中需要取相册的第一张照片展示出来,并且UIImageView需要一个白色的2pt宽、6pt圆角的边框,并且需要对imageView进行一定角度的旋转。如果仅仅对imageView进行旋转的话会导致view边缘锯齿化,经查阅资料,有这样的解决办法:

解决办法

  1. 如果是imageView的话,可以对UIImage进行重绘:

    - (UIImage *)antiAlias
    {
        CGFloat border = 1.0f;
        CGRect rect = CGRectMake(border, border, self.size.width-2*border, self.size.height-2*border);
        UIImage *img = nil;
    
        UIGraphicsBeginImageContext(CGSizeMake(rect.size.width,rect.size.height));
        [self drawInRect:CGRectMake(-1, -1, self.size.width, self.size.height)];
        img = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        UIGraphicsBeginImageContext(self.size);
        [img drawInRect:rect];
        UIImage* antiImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return antiImage;
    } 
    

    这样会给image加一个1像素的透明边框,从而消除锯齿。

  2. 在iOS 7以上,苹果为我们提供了一个属性:allowsEdgeAntialiasing来进行锯齿的消除:

    layer.allowsEdgeAntialiasing = YES;
    

    这样也可以将锯齿消除。

  3. 但是在图片旋转后,仅仅设置allowsEdgeAntialiasing为YES,还是可以看到UIImageView边缘有细小的锯齿,我们可以通过再设置layer的shouldRasterize属性为YES来消除这些细小的锯齿:

    layer. shouldRasterize = YES;
    layer.allowsEdgeAntialiasing = YES;
    

效果展示

下面的三张图分别为:

  1. 未进行任何处理
  2. 将allowsEdgeAntialiasing属性设置为YES
  3. 将shouldRasterize、allowsEdgeAntialiasing属性均设置为YES

未进行任何处理

将allowsEdgeAntialiasing属性设置为YES

将shouldRasterize、allowsEdgeAntialiasing属性均设置为YES

上一篇:解决打包脚本在 Xcode9 环境下报错 下一篇:xshell无法在vim中用鼠标复制黏贴