将全局类应用于UIImage

时间:2015-03-24 14:34:45

标签: ios uiimage

现在我不确定在Objective-C中这是否可行,但我希望它应该是。

我使用UIImages

上的以下/类似代码在我的故事板上有多个图像
cell.followingImage.layer.cornerRadius = cell.followingImage.frame.size.width / 2;
cell.followingImage.clipsToBounds = YES;

我想优化代码。我知道你可以将类应用到对象,但我以前从未这样做过。是否可以通过故事板应用该类并自动运行该代码而无需引用并将其添加到每个控制器?

因此,如果某个类附加到UIImage,它只会运行该代码并使UIImage成为一个圆圈?这可能很简单......

如果我要创建UIimage的子类,我不确定上面的代码放在哪里?

5 个答案:

答案 0 :(得分:0)

尝试制作一个UIImage类别。在此自定义类别类中包含您想要的所有内容,例如cornerRadius和clipToBounds代码。然后,当您初始化图像时,不要使用[UIImage new]初始化图像,但使用[customImageCategoryName new [。现在,默认情况下,所有这些图像都具有这两行代码。以下链接将向您展示如何在Xcode How do I create a category in Xcode 6 or higher?

中创建类别

答案 1 :(得分:0)

请将该代码放入 -(instancetype)initWithCoder:(NSCoder *)aDecoder方法,-(instancetype)initWithFrame:(CGRect)frame方法 和init方法。

这样,如果imageview来自storyboard,initWithCoder将被调用,并且在以编程方式添加时会调用其他方法。

答案 2 :(得分:0)

由于其他答案都没有真正奏效,也没有完整,我使用了User Defined Runtime Attributes

为了避免在代码中编写它,我添加了

layer.cornerRadius Number属性的一半宽度。

layer.masksToBounds Bool属性为YES

答案 3 :(得分:-1)

方法调配是实现这一目标的一个非常好的选择。 创建一个UIImageView类别类和swizzle initWithCoder:方法

#import "UIImageView+MethodSwizzling.h"
#import <objc/runtime.h>


@implementation UIImageView (MethodSwizzling)
+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];

        SEL originalSelector = @selector(initWithCoder:);
        SEL swizzledSelector = @selector(xxx_initWithCoder:);

        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

        // When swizzling a class method, use the following:
        // Class class = object_getClass((id)self);
        // ...
        // Method originalMethod = class_getClassMethod(class, originalSelector);
        // Method swizzledMethod = class_getClassMethod(class, swizzledSelector);

        BOOL didAddMethod =
        class_addMethod(class,
                        originalSelector,
                        method_getImplementation(swizzledMethod),
                        method_getTypeEncoding(swizzledMethod));

        if (didAddMethod) {
            class_replaceMethod(class,
                                swizzledSelector,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod));
        }
        else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

#pragma mark - Method Swizzling

- (id)xxx_initWithCoder:(NSCoder*)aDecoder {
    [self xxx_initWithCoder:aDecoder];
    self.layer.cornerRadius = self.frame.size.width / 2;
    self.layer.masksToBounds = YES;
    NSLog(@"xxx_initWithCoder: %@", self);
    return self;
}

您不必创建UIImageView的子类,也不需要在XIB / Storybord中的任何位置更改对象的类。

Click here了解方法调配。

答案 4 :(得分:-2)

您的“回答”表明您在故事板中使用UIImageView。最好的方法是创建UIImageView的子类,例如:

//MyImageView.h
#import <UIKit/UIKit.h>
@interface MyImageView : UIImageView
@end

应将cornerRadiusclipsToBounds的代码添加到MyImageView.m中:

//MyImageView.m
- (id)layoutSubviews {
    [super layoutSubviews];
    self.layer.cornerRadius = self.view.frame.width.width / 2
    self.layer.clipsToBounds = true;
    // this line may be only needed in init since the clipsToBounds does not change due to autoLayout.
}

在编写该代码之后,您需要将Storyboard中的所有UIImageView的class属性(所有应该是圆形的)设置为MyImageView而不是默认的UIImageView