用新属性扩展UIView

时间:2018-09-19 20:45:25

标签: ios swift properties uikit

在我的应用中,我需要向UIKit对象中添加一些属性;我最初的想法是为我需要的每个元素创建一个子类,并在新类中创建属性,但是我意识到这意味着为我正在使用的每种UI元素类型编写一个新类。

在我的特定情况下,我想添加一些不同的视图,例如UIImageViewUILabel。类型为initial position的两个属性,分别为final positionCGRect,用于存储初始和最终的正电子,以便在翻译此视图的方法中使用它

有什么方法可以在不创建很多类的情况下完成此任务吗?

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage(PageSizePaper.A4,true);
ObjectFactory factory=Context.getWmlObjectFactory();Tbl table = factory.createTbl();
Tr tableRow = factory.createTr();    
byte[] imageBytes = Base64.getDecoder().decode(t.getBase64Image());
BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordPackage, imageBytes);
Inline inline = imagePart.createImageInline("image", "image", 0, 1, false);

P celPar = addInlineImageToParagraph(inline, factory);

Tc tableCell = factory.createTc();
tableCell.getContent().clear();
tableCell.getContent().add(celPar);
tableRow.getContent().add(tableCell); 
wordPackage.getMainDocumentPart().addObject(table);


private P addInlineImageToParagraph(Inline inline, ObjectFactory factory) {
    P paragraph = factory.createP();
    R run = factory.createR();
    paragraph.getContent().add(run);
    Drawing drawing = factory.createDrawing();
    run.getContent().add(drawing);
    drawing.getAnchorOrInline().add(inline);
    return paragraph;
}

不可能仅在扩展名中声明属性,因此您需要设置protocol Position { var initialPosition: Int { get set } } get。您可以只关联一个值:

set

然后您像这样扩展private var initialPositionKey: UInt = 0 extension Position { var initialPosition: Int { get { return objc_getAssociatedObject(self, &initialPositionKey) as! Int } set { objc_setAssociatedObject(self, &initialPositionKey, newValue, .OBJC_ASSOCIATION_RETAIN) } } }

UIView

以及以下作品:

extension UIView: Position {}