使用UIImage和其他属性创建自定义图像

时间:2016-04-05 14:10:52

标签: ios swift uiimage cgcontext cgcontextdrawimage

我希望在iOS中创建自定义图片。例如,该图像将用于共享社交网站。

例如,用户可能会选择我们引用的照片为UIImage。使用此图像,我们想要创建包含其中原始图像的另一个图像。

这个想法是创建一个宝丽来风格的图像,底部有一些书写/措辞。实现这一目标的最佳方法是什么?

我的第一个想法是创建一个XIB来控制布局并在屏幕外启动它,使用快照创建完成的UIImagedealloc视图。或者使用CGContextDrawImage会更好吗?担心的是布局,如果我们有多个需要特定布局的项目,那么上下文绘图将很容易实现

3 个答案:

答案 0 :(得分:1)

我能够在下面创建此图片: Polaroid

通过以下方法:

  1. 像宝丽来一样设置XIB: Static 我的相当静态,但您可以使用文件所有者和其他一些魔术来轻松设置图像和文本。

  2. 使用以下命令设置类文件:

    import Foundation
    import UIKit
    
    class LoveIs: UIView {
    
    class func instanceFromNib() -> UIView {
        return UINib(nibName: "Polaroid", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
    }    }
    
  3. 设置您的主视图控制器(一个“提取'图像”),如下所示:

    var loveIs: UIView? = nil
    
    loveIs = LoveIs.instanceFromNib()
    
    loveIs?.layer.borderColor = UIColor.darkGrayColor().CGColor
    loveIs?.layer.borderWidth = 5
    UIGraphicsBeginImageContext((loveIs?.bounds.size)!)
    loveIs?.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    UIImageWriteToSavedPhotosAlbum(image, self, nil, nil)
    

答案 1 :(得分:0)

您可以创建一个UIView并向其添加UIImageView和UILabel。然后截取该视图的屏幕截图。

解决方案1:

UIGraphicsBeginImageContext(screenShotView.bounds.size)
screenShotView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
letscreenShot  = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

解决方案2:

var screenShot:UIView = screenShotView.snapshotViewAfterScreenUpdates(true)
UIGraphicsBeginImageContextWithOptions(screenShotView.bounds.size, true, 0.0)
screenShot.drawViewHierarchyInRect(screenShotView.bounds, afterScreenUpdates: true)
var shotCapture :UIImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

答案 2 :(得分:0)

我建议在代码中生成图像,因为快照屏幕会限制您对屏幕的大小。此外,当一切都在代码中时,我发现管理复杂操作更容易。

https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller可帮助您将原始图像复制到新图像的区域。

下面是一个如何自己创建图像的示例,其中包含居中的文本和形状(在这种情况下,上面带有矩形框的三角形,名称居中)。

// Get font from custom class and create text styles
UIFont *font = [CBFontHelper robotoMedium:32.0f];
NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
paragraphStyle.alignment = NSTextAlignmentCenter;
NSDictionary *textAttributes = @{
        NSFontAttributeName: font,
        NSForegroundColorAttributeName: [CBColourHelper white],
};
CGSize textSize = [name sizeWithAttributes:textAttributes];
// various bits of paddings and heights neccessary to calculate total image size
float gap = 2.0f;
float textHeight = 0.3f*interfacePadding + textSize.height + 0.3f*interfacePadding;
float width = 200;
float height = textHeight + gap + 2*interfacePadding;

//create new image context
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width,height), false, 0.0f);
// Fill rectangle to hold name
[[CBColourHelper sandstone] setFill];
UIRectFill(CGRectMake(0.0f,0.0f,width,textHeight));

//Draw name over rectangle
[self drawString:name withFont:font inRect:CGRectMake(0.5f*interfacePadding, 0.3f*interfacePadding, width, height)];

// Draw triangle
[[CBColourHelper sandstone] setFill];
UIBezierPath *triangle = [UIBezierPath bezierPath];
[triangle moveToPoint:CGPointMake(width/2,textHeight + gap)];
[triangle addLineToPoint:CGPointMake(width/2,height)];
[triangle addLineToPoint:CGPointMake(width/2+5.0f*interfacePadding,textHeight + gap)];
[triangle closePath];
[triangle fill];

// Get image from context 
UIImage *markerImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();