重构 ViewController 代码以将返回 UIImage 的方法移动到相关子类中

Posted

技术标签:

【中文标题】重构 ViewController 代码以将返回 UIImage 的方法移动到相关子类中【英文标题】:Refactoring ViewController code to move method that returns UIImage into a relevant subclass 【发布时间】:2014-01-19 22:53:04 【问题描述】:

我已经创建了一个返回 UIImage 的方法,如下所示:

- (UIImage *)circularOverlayMask

    // Constants
    CGRect rect = self.navigationController.view.bounds;
    CGFloat width = rect.size.width;
    CGFloat height = rect.size.height;

    CGFloat diameter = width-(kInnerEdgeInset*2);
    CGFloat radius = diameter/2;
    CGPoint center = CGPointMake(width/2, height/2);
    UIColor *fillColor = [UIColor colorWithWhite:0 alpha:0.5];

    // Create the image context
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);

    // Create the bezier paths
    UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:rect];
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(center.x-radius, center.y-radius, diameter, diameter)];

    [clipPath appendPath:maskPath];
    clipPath.usesEvenOddFillRule = YES;

    [clipPath addClip];
    [fillColor setFill];
    [clipPath fill];

    UIImage *_maskedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return _maskedImage;
  

这按预期工作,目前在我的视图控制器代码中。我正在尝试更好地重构视图控制器的代码,并希望将其移至适当的子类。

我最初的想法是继承 UIImage 并以某种方式返回图像。另一个想法是继承UIImageView 并在init 方法中调用initWithImage 然后[self circularOverlayMask];。另一个想法是简单地继承 NSObject 并添加方法,然后在需要的地方导入并调用公共 + 方法。

问题 将这个简单方法重构为相关子类的正确方法是什么?

【问题讨论】:

【参考方案1】:

我会用这个方法写一个UIImage 的类别,而不是子类。因此,要使用它,您必须导入您的类别:

#import "UIImage+Masks.h"

然后您就可以通过UIImage 调用它:

[UIImage circularOverlayMaskForRect:]

【讨论】:

该方法必须将视图边界作为参数,例如circularOverlayMaskForRect: @MartinR 是的,谢谢。我只是举了一个简单的例子。 谢谢大家,我已经完成了上面的操作,但是当我调用 UIImage *maskImage = [UIImage circularOverlayMaskForRect:self.view.bounds]; 时,我收到一个错误 no known class method for selector circular...?这个应该怎么称呼。我已正常导入标题 @StuartM 当然你应该先写实际的类别类;)developer.apple.com/library/mac/documentation/Cocoa/Conceptual/… 如果这就是你的意思,我已经写了这个类别。我不只是尝试导入一个不存在的类别,它不会建立它;)

以上是关于重构 ViewController 代码以将返回 UIImage 的方法移动到相关子类中的主要内容,如果未能解决你的问题,请参考以下文章

重构此函数以将其认知复杂度从 17 降低到允许的 15

fetchedResultsController 返回 nil

小酌重构系列[22]——尽快返回

小酌重构系列[22]——尽快返回

如何编辑下面的 jQuery 以将悬停徽标更改返回到原始状态?

启动对话框以获取结果以将值返回给主要活动