重构 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 的方法移动到相关子类中的主要内容,如果未能解决你的问题,请参考以下文章
fetchedResultsController 返回 nil