我的代码在普通设备上工作正常,但在视网膜设备上产生模糊的图像。

有人知道我的问题的解决方案吗?

+ (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContext(view.bounds.size);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}

当前回答

从使用UIGraphicsBeginImageContext切换到使用UIGraphicsBeginImageContextWithOptions(如本页所述)。通过0.0进行缩放(第三个参数),您将获得一个缩放因子与屏幕的缩放因子相等的上下文。

UIGraphicsBeginImageContext使用了一个固定的缩放因子1.0,所以你实际上在iPhone 4和其他iPhone上得到了完全相同的图像。我敢打赌,要么是iPhone 4在你隐式放大它的时候应用了一个过滤器,要么就是你的大脑发现它比周围的所有东西都更不清晰。

所以,我想:

#import <QuartzCore/QuartzCore.h>

+ (UIImage *)imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}

在Swift 4中:

func image(with view: UIView) -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
    defer { UIGraphicsEndImageContext() }
    if let context = UIGraphicsGetCurrentContext() {
        view.layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        return image
    }
    return nil
}

其他回答

有时drawRect方法使问题,所以我得到这些答案更合适。你也可以看看 在DrawRect方法中捕获UIView的UIImage

从使用UIGraphicsBeginImageContext切换到使用UIGraphicsBeginImageContextWithOptions(如本页所述)。通过0.0进行缩放(第三个参数),您将获得一个缩放因子与屏幕的缩放因子相等的上下文。

UIGraphicsBeginImageContext使用了一个固定的缩放因子1.0,所以你实际上在iPhone 4和其他iPhone上得到了完全相同的图像。我敢打赌,要么是iPhone 4在你隐式放大它的时候应用了一个过滤器,要么就是你的大脑发现它比周围的所有东西都更不清晰。

所以,我想:

#import <QuartzCore/QuartzCore.h>

+ (UIImage *)imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}

在Swift 4中:

func image(with view: UIView) -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
    defer { UIGraphicsEndImageContext() }
    if let context = UIGraphicsGetCurrentContext() {
        view.layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        return image
    }
    return nil
}

所有Swift 3的答案都不适合我,所以我翻译了最受欢迎的答案:

extension UIImage {
    class func imageWithView(view: UIView) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
        view.layer.render(in: UIGraphicsGetCurrentContext()!)
        let img: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img!
    }
}

在这个方法中,只需要传递一个view对象它就会返回一个UIImage对象。

-(UIImage*)getUIImageFromView:(UIView*)yourView
{
 UIGraphicsBeginImageContext(yourView.bounds.size);
 [yourView.layer renderInContext:UIGraphicsGetCurrentContext()];
 UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 return image;
}

斯威夫特3

带有UIView扩展的Swift 3解决方案(基于Dima的回答)应该是这样的:

extension UIView {
    public func getSnapshotImage() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.isOpaque, 0)
        self.drawHierarchy(in: self.bounds, afterScreenUpdates: false)
        let snapshotImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return snapshotImage
    }
}