Как создать UIPrintPaper для проверки UIPrintInteractionControllerDelegate
Написав UIPrintInteractionControllerDelegate
Я хочу провести модульное тестирование функциональности выбора бумаги в printInteractionController:choosePaper:
Его декларация:
optional func printInteractionController(_ printInteractionController: UIPrintInteractionController, choosePaper paperList: [UIPrintPaper]) -> UIPrintPaper
Это простой вопрос вызова его с предопределенными значениями UIPrintPaper и проверки вывода. Однако я не могу создать экземпляры UIPrintPaper. Вот как объявляется UIPrintPaper:
NS_CLASS_AVAILABLE_IOS(4_2)__TVOS_PROHIBITED @interface UIPrintPaper : NSObject
+ (UIPrintPaper *)bestPaperForPageSize:(CGSize)contentSize withPapersFromArray:(NSArray<UIPrintPaper *> *)paperList; // for use by delegate. pass in list
@property(readonly) CGSize paperSize;
@property(readonly) CGRect printableRect;
@end
Свойства paperSize и printableRect доступны только для чтения, и для их определения не существует инициализатора. Как я могу создать UIPrintPaper для представления разных размеров бумаги для моих тестов? (A4, письмо США, 4x6...)
3 ответа
Не могу управлять UIPrintPaper, но подклассифицировать его для переопределения его свойств только для чтения просто:
class FakePrintPaper: UIPrintPaper {
private let size: CGSize
override var paperSize: CGSize { return size }
override var printableRect: CGRect { return CGRect(origin: CGPointZero, size: size) }
init(size: CGSize) {
self.size = size
}
}
Я не думаю, что вы должны создавать UIPrintPaper. Apple API вызывает:
- (UIPrintPaper*)printInteractionController:(UIPrintInteractionController *)printInteractionController choosePaper:(NSArray<UIPrintPaper *> *)paperList
... на вашем UIPrintInteractionControllerDelegate с массивом всех UIPaper, поддерживаемых вашим принтером. Если вы не получили тот, который вам нужен, принтер не поддерживает его.
Таким образом, вместо того, чтобы создать его, реализуйте этот вызов делегата и верните правильный UIPrintPaper из параметров, поддерживаемых принтером.
Использовать UIPrintPaper
метод класса bestPaperForPageSize
:
let paper = UIPrintPaper.bestPaperForPageSize(CGSize(...), withPapersFromArray: [...])
Я полагаю, вы хотели бы использовать это так:
class MyClass: NSObject { }
extension MyClass: UIPrintInteractionControllerDelegate {
func printInteractionController(printInteractionController: UIPrintInteractionController, choosePaper paperList: [UIPrintPaper]) -> UIPrintPaper {
return UIPrintPaper.bestPaperForPageSize(CGSize(...), withPapersFromArray: paperList)
}
}
Где CGSize - это размер вашей бумаги.