我希望在iOS
中创建自定义图片。例如,该图像将用于共享社交网站。
例如,用户可能会选择我们引用的照片为UIImage
。使用此图像,我们想要创建包含其中原始图像的另一个图像。
这个想法是创建一个宝丽来风格的图像,底部有一些书写/措辞。实现这一目标的最佳方法是什么?
我的第一个想法是创建一个XIB
来控制布局并在屏幕外启动它,使用快照创建完成的UIImage
和dealloc
视图。或者使用CGContextDrawImage
会更好吗?担心的是布局,如果我们有多个需要特定布局的项目,那么上下文绘图将很容易实现
答案 0 :(得分:1)
我能够在下面创建此图片: Polaroid
通过以下方法:
使用以下命令设置类文件:
import Foundation
import UIKit
class LoveIs: UIView {
class func instanceFromNib() -> UIView {
return UINib(nibName: "Polaroid", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
} }
设置您的主视图控制器(一个“提取'图像”),如下所示:
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();