UIGraphicsBeginPDFContextToFile правильный размер страницы на основе языка

В моем приложении я создаю PDF (который может быть напечатан или отправлен позже), и я не могу найти правильный способ определения размера бумаги:

UIGraphicsBeginPDFContextToFile(pdfURL().path, CGRectZero, nil) 

По умолчанию создается pdf ANSI A (612.0, 792.0), что подходит для США и Канады (+ несколько стран), но для остальных это должен быть ISO216 A4 (595,842)

В основном мне нужна версия iOS:

 NSPrintInfo.sharedPrintInfo().paperSize 

Я что-то упустил или единственный способ в iOS – проверить локаль вручную?

Решение :

Поскольку Письмо США (ANSI A) используется только в Северной Америке, Боливии, Колумбии, Панаме, Венесуэле, Филиппинах, Коста-Рике и Чили. Мы можем просто взять код страны из нашего текущего региона и проверить, находится ли он в списке этих стран.

SWIFT 3 (расширение):

 extension NSLocale { struct StandardPageDimensions { static let ANSI_A = CGSize(width:612,height:792) static let ANSI_B = CGSize(width:792,height:1224) static let ANSI_C = CGSize(width:1584,height:1224) static let ANSI_D = CGSize(width:2448,height:1584) static let ANSI_E = CGSize(width:3168,height:2448) static let ISO216_A0 = CGSize(width:2384,height:3370) static let ISO216_A1 = CGSize(width:1684,height:2384) static let ISO216_A2 = CGSize(width:1190,height:1684) static let ISO216_A3 = CGSize(width:842,height:1190) static let ISO216_A4 = CGSize(width:595,height:842) static let ISO216_A5 = CGSize(width:420,height:595) static let ISO216_A6 = CGSize(width:298,height:420) static let ISO216_A7 = CGSize(width:210,height:298) static let ISO216_A8 = CGSize(width:148,height:210) } static let ANSI_A_Countries : Set<String> = ["US","CA","MX","CU","DO","GT","CR","SV","HN","BO","CO","VE","PH","CL"] //If you want to use Locale use regionCode static func defaultPaperSize()->CGSize { let locale = self.current return ANSI_A_Countries.contains( locale.regionCode ?? "" ) ? StandardPageDimensions.ANSI_A : StandardPageDimensions.ISO216_A4 } //otherwise cast to NSLocale // static func defaultPaperSize()->CGSize { // let locale = self.current as NSLocale // return ANSI_A_Countries.contains( locale.object(forKey: NSLocale.Key.countryCode) as! String ) ? StandardPageDimensions.ANSI_A : StandardPageDimensions.ISO216_A4 // } } 

Причина, по которой я не использовал Locale.currencyCode, потому что CurrencyCode не всегда равен CountryCode.

ISO 3166-2! = ISO 4217

Возможно, вам потребуется обновить ANSI_A_Countries, чтобы соответствовать требованиям ISO. Например, Боливия, Bolíviano Country (( https://en.wikipedia.org/wiki/ISO_3166-2:BO )) Код 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 }