5
新的ios 7手機應用程序具有收藏夾部分。在該部分中,聯繫人的姓名將顯示在圓圈內的聯繫人的初始位置的旁邊。用iOS中的字母繪製實心圓圈7
這是如何繪製的?使用drawrect還是已經存在,併爲此創建對象?
新的ios 7手機應用程序具有收藏夾部分。在該部分中,聯繫人的姓名將顯示在圓圈內的聯繫人的初始位置的旁邊。用iOS中的字母繪製實心圓圈7
這是如何繪製的?使用drawrect還是已經存在,併爲此創建對象?
下面是一個UIView
子類,它將做你想做的。它將正確地確定和定位圈內的一個或多個字母。下面是它的外觀與在各種尺寸1-3字母(32,64,128,256):
與用戶定義的運行時的可用性在界面生成器屬性,可以甚至配置從視圖在IB內。只需將text
屬性設置爲運行時屬性,並將backgroundColor
設置爲所需的圓形顏色即可。
下面的代碼:
@interface MELetterCircleView : UIView
/**
* The text to display in the view. This should be limited to
* just a few characters.
*/
@property (nonatomic, strong) NSString *text;
@end
@interface MELetterCircleView()
@property (nonatomic, strong) UIColor *circleColor;
@end
@implementation MELetterCircleView
- (instancetype)initWithFrame:(CGRect)frame text:(NSString *)text
{
NSParameterAssert(text);
self = [super initWithFrame:frame];
if (self)
{
self.text = text;
}
return self;
}
// Override to set the circle's background color.
// The view's background will always be clear.
-(void)setBackgroundColor:(UIColor *)backgroundColor
{
self.circleColor = backgroundColor;
[super setBackgroundColor:[UIColor clearColor]];
}
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
[self.circleColor setFill];
CGContextAddArc(context, CGRectGetMidX(rect), CGRectGetMidY(rect),
CGRectGetWidth(rect)/2, 0, 2*M_PI, YES);
CGContextFillPath(context);
[self drawSubtractedText:self.text inRect:rect inContext:context];
}
- (void)drawSubtractedText:(NSString *)text inRect:(CGRect)rect
inContext:(CGContextRef)context
{
CGContextSaveGState(context);
// Magic blend mode
CGContextSetBlendMode(context, kCGBlendModeDestinationOut);
CGFloat pointSize =
[self optimumFontSizeForFont:[UIFont boldSystemFontOfSize:100.f]
inRect:rect
withText:text];
UIFont *font = [UIFont boldSystemFontOfSize:pointSize];
// Move drawing start point for centering label.
CGContextTranslateCTM(context, 0,
(CGRectGetMidY(rect) - (font.lineHeight/2)));
CGRect frame = CGRectMake(0, 0, CGRectGetWidth(rect), font.lineHeight)];
UILabel *label = [[UILabel alloc] initWithFrame:frame];
label.font = font;
label.text = text;
label.textAlignment = NSTextAlignmentCenter;
label.backgroundColor = [UIColor clearColor];
[label.layer drawInContext:context];
// Restore the state of other drawing operations
CGContextRestoreGState(context);
}
-(CGFloat)optimumFontSizeForFont:(UIFont *)font inRect:(CGRect)rect
withText:(NSString *)text
{
// For current font point size, calculate points per pixel
CGFloat pointsPerPixel = font.lineHeight/font.pointSize;
// Scale up point size for the height of the label.
// This represents the optimum size of a single letter.
CGFloat desiredPointSize = rect.size.height * pointsPerPixel;
if ([text length] == 1)
{
// In the case of a single letter, we need to scale back a bit
// to take into account the circle curve.
// We could calculate the inner square of the circle,
// but this is a good approximation.
desiredPointSize = .80*desiredPointSize;
}
else
{
// More than a single letter. Let's make room for more.
desiredPointSize = desiredPointSize/[text length];
}
return desiredPointSize;
}
@end
看看我的回答http://stackoverflow.com/questions/18716751/drawing-a-path-with-subtracted-text-採用核心圖形/ 18830509#18830509。讓我知道這是否有幫助。 –
我弄明白了,但也會引用你的答案。我使用核心圖形和UILabel。 – cdub
@chris請參閱下面的答案。如果有幫助,請將其標記爲已接受。 – memmons