Как создать 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 - это размер вашей бумаги.

Другие вопросы по тегам