如何创建一个 UIPrintPaper 来测试 UIPrintInteractionControllerDelegate

How to create a UIPrintPaper to test 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...)

使用UIPrintPaperclass方法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 是您的纸张尺寸。

无法控制 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 数组。如果你没有得到你想要的,那么打印机不支持它。

因此,与其创建一个,不如实施此委托调用,并 return 来自打印机支持的参数的正确 UIPrintPaper。