Ios UIGraphicsBeginPDFContextToFile基于区域设置更正页面大小

Ios UIGraphicsBeginPDFContextToFile基于区域设置更正页面大小,ios,swift,pdf,printing,Ios,Swift,Pdf,Printing,在我的应用程序中,我生成了pdf(以后可以打印或发送) 我找不到合适的方法来确定纸张的尺寸: UIGraphicsBeginPDFContextToFile(pdfURL().path, CGRectZero, nil) 默认情况下,创建pdfANSI A(612.0792.0),这对美国和加拿大(+更多国家)来说是可以的,但对于其他国家,它应该是ISO216 A4(595842) 基本上我需要iOS版本的: NSPrintInfo.sharedPrintInfo().paperSiz

在我的应用程序中,我生成了pdf(以后可以打印或发送) 我找不到合适的方法来确定纸张的尺寸:

    UIGraphicsBeginPDFContextToFile(pdfURL().path, CGRectZero, nil)
默认情况下,创建pdfANSI A(612.0792.0),这对美国和加拿大(+更多国家)来说是可以的,但对于其他国家,它应该是ISO216 A4(595842)

基本上我需要iOS版本的:

NSPrintInfo.sharedPrintInfo().paperSize
我是否遗漏了什么,或者在iOS上唯一的方法就是手动检查区域设置?

解决方案: 由于美国字母(ANSI A)仅在北美、玻利维亚、哥伦比亚、巴拿马、委内瑞拉、菲律宾、哥斯达黎加和智利使用。我们可以从我们当前的语言环境中提取国家代码,然后检查它是否在这些国家的列表中

SWIFT 3(延期):

扩展NSLocale{ 结构标准页面维度{ 静态let ANSI_A=CGSize(宽:612,高:792) 静态let ANSI_B=CGSize(宽:792,高:1224) 静态let ANSI_C=CGSize(宽:1584,高:1224) 静态let ANSI_D=CGSize(宽:2448,高:1584) 静态let ANSI_E=CGSize(宽:3168,高:2448) 静态let ISO216_A0=CGSize(宽:2384,高:3370) 静态let ISO216_A1=CGSize(宽:1684,高:2384) 静态let ISO216_A2=CGSize(宽:1190,高:1684) 静态let ISO216_A3=CGSize(宽:842,高:1190) 静态let ISO216_A4=CGSize(宽:595,高:842) 静态let ISO216_A5=CGSize(宽:420,高:595) 静态let ISO216_A6=CGSize(宽:298,高:420) 静态let ISO216_A7=CGSize(宽:210,高:298) 静态let ISO216_A8=CGSize(宽:148,高:210) } 静态let ANSI_A_国家/地区:Set=[“美国”、“加拿大”、“墨西哥”、“古巴”、“DO”、“GT”、“CR”、“SV”、“HN”、“BO”、“CO”、“VE”、“PH”、“CL”] //如果要使用区域设置,请使用regionCode 静态函数defaultPaperSize()->CGSize{ 让locale=self.current 返回ANSI_A_Countries.contains(locale.regionCode???)?StandardPageDimensions.ANSI_A:StandardPageDimensions.ISO216_A4 } //否则强制转换为NSLocale //静态函数defaultPaperSize()->CGSize{ //让locale=self.current作为NSLocale //将ANSI_A_Countries.contains(locale.object(forKey:NSLocale.Key.countryCode)返回为!String)?StandardPageDimensions.ANSI_A:StandardPageDimensions.ISO216_A4 // } } 我没有使用Locale.currencyCode的原因是因为currencyCode并不总是等于CountryCode。

ISO 3166-2!=ISO 4217

您可能需要更新ANSI\U A\U国家/地区以匹配ISO的货币。 例如玻利维亚、波利维亚诺国家() )ISO代码指定为BO,但货币代码只有BOL

SWIFT 2:

struct StandardPageDimensions  {
    static let ANSI_A        = CGSizeMake(612,792)
    static let ANSI_B        = CGSizeMake(792,1224)
    static let ANSI_C        = CGSizeMake(1584,1224)
    static let ANSI_D        = CGSizeMake(2448,1584)
    static let ANSI_E        = CGSizeMake(3168,2448)

    static let ISO216_A0     = CGSizeMake(2384,3370)
    static let ISO216_A1     = CGSizeMake(1684,2384)
    static let ISO216_A2     = CGSizeMake(1190,1684)
    static let ISO216_A3     = CGSizeMake(842,1190)
    static let ISO216_A4     = CGSizeMake(595,842)
    static let ISO216_A5     = CGSizeMake(420,595)
    static let ISO216_A6     = CGSizeMake(298,420)
    static let ISO216_A7     = CGSizeMake(210,298)
    static let ISO216_A8     = CGSizeMake(148,210)
}

let ANSI_A_Countries : Set<String> = ["US","CA","MX","CU","DO","GT","CR","SV","HN","BO","CO","VE","PH","CL"]

func defaultSizeForCurrentLocale()->CGSize {
    let locale = NSLocale.currentLocale()
    return ANSI_A_Countries.contains( locale.objectForKey(NSLocaleCountryCode) as! String ) ? StandardPageDimensions.ANSI_A : StandardPageDimensions.ISO216_A4
}
struct-StandardPageDimensions{
静态let ANSI_A=CGSizeMake(612792)
静态let ANSI_B=CGSizeMake(7921224)
静态let ANSI_C=CGSizeMake(15841224)
静态let ANSI_D=CGSizeMake(24481584)
静态let ANSI_E=CGSizeMake(31682448)
静态let ISO216_A0=CGSizeMake(23843370)
静态let ISO216_A1=CGSizeMake(16842384)
静态let ISO216_A2=CGSizeMake(11901684)
静态let ISO216_A3=CGSizeMake(8421190)
静态let ISO216_A4=CGSizeMake(595842)
静态let ISO216_A5=CGSizeMake(420595)
静态let ISO216_A6=CGSizeMake(298420)
静态let ISO216_A7=CGSizeMake(210298)
静态let ISO216_A8=CGSizeMake(148210)
}
让ANSI_A_国家/地区:Set=[“美国”、“加拿大”、“墨西哥”、“古巴”、“DO”、“GT”、“CR”、“SV”、“HN”、“BO”、“CO”、“VE”、“PH”、“CL”]
func defaultSizeForCurrentLocale()->CGSize{
让locale=NSLocale.currentLocale()
返回ANSI_A_Countries.contains(locale.objectForKey(NSLocaleCountryCode)as!String)?StandardPageDimensions.ANSI_A:StandardPageDimensions.ISO216_A4
}
检查
bestPaper.paperSize.width
bestPaper.paperSize.height
,您将获得基于当前区域的本地化结果:

美国:
612x792
,这是美国字母

联合王国:
595.2756 x 841.8898
,即A4


请注意,没有文档记录指定空页面大小和空纸张列表将生成此默认值,但我看到的就是这种行为。

您是否尝试在其他语言环境中运行该应用程序?是的,我始终使用612.0和792.0。正如Apple documentations所说的UIGraphicsBeginPDFContextToFile bounds:一个指定PDF页面默认大小和位置的矩形。(此值用作每个新页面的默认媒体框。)矩形的原点通常应为(0,0)。指定空矩形(CGRectZero)会将默认页面大小设置为8.5 x 11英寸(612 x 792点)。您可能需要进行本地化操作以检查其区域设置:-(,我确信有更好的方法,但我无能为力,抱歉。无论如何,谢谢。本地化检查是我目前的功能。我将等待,看看是否有人有其他解决方案。我认为这个答案是关于这个主题的正确答案。问题是,本地化设置建议的纸张大小是多少?答案是国家静态的,请让ANSI_A_国家:Set=[“US”、“CA”、“MX”、“CU”、“DO”、“GT”、“CR”、“SV”、“HN”、“BO”、“CO”、“VE”、“PH”、“CL”]是间接假设,用户不可选择。设置首选纸张大小布局是操作系统区域设置功能,而不是应用程序作业。如果操作系统区域设置功能不提供用户界面以让用户了解,则不是应用程序的责任,而是操作系统的责任。我们不能让应用程序作为解决方案覆盖操作系统?问题出在哪里“没有文件证明指定空白页面大小和空白纸张列表将生成此默认值,但我看到的是这种行为”,这是操作系统供应商的文件问题,在这里,这不是操作系统供应商的责任
struct StandardPageDimensions  {
    static let ANSI_A        = CGSizeMake(612,792)
    static let ANSI_B        = CGSizeMake(792,1224)
    static let ANSI_C        = CGSizeMake(1584,1224)
    static let ANSI_D        = CGSizeMake(2448,1584)
    static let ANSI_E        = CGSizeMake(3168,2448)

    static let ISO216_A0     = CGSizeMake(2384,3370)
    static let ISO216_A1     = CGSizeMake(1684,2384)
    static let ISO216_A2     = CGSizeMake(1190,1684)
    static let ISO216_A3     = CGSizeMake(842,1190)
    static let ISO216_A4     = CGSizeMake(595,842)
    static let ISO216_A5     = CGSizeMake(420,595)
    static let ISO216_A6     = CGSizeMake(298,420)
    static let ISO216_A7     = CGSizeMake(210,298)
    static let ISO216_A8     = CGSizeMake(148,210)
}

let ANSI_A_Countries : Set<String> = ["US","CA","MX","CU","DO","GT","CR","SV","HN","BO","CO","VE","PH","CL"]

func defaultSizeForCurrentLocale()->CGSize {
    let locale = NSLocale.currentLocale()
    return ANSI_A_Countries.contains( locale.objectForKey(NSLocaleCountryCode) as! String ) ? StandardPageDimensions.ANSI_A : StandardPageDimensions.ISO216_A4
}
let bestPaper = UIPrintPaper.bestPaper(forPageSize: CGSize.zero, withPapersFrom: [])