gpt4 book ai didi

ios - 在 iOS 7 中用字母绘制实心圆圈

转载 作者:可可西里 更新时间:2023-11-01 04:23:42 27 4
gpt4 key购买 nike

新的 ios 7 手机应用程序有一个收藏夹部分。在该部分中,联系人姓名显示在一个实心圆圈旁边,圆圈内是联系人姓名的首字母。

这是怎么画的?使用 drawrect 还是已经为此创建了对象?

最佳答案

下面是一个 UIView 子类,它将执行您想要的操作。它将正确调整圆圈中 1 个或多个字母的大小和位置。以下是 1-3 个不同大小(32、64、128、256)字母的外观:

Screenshot

有了 Interface Builder 中用户定义的运行时属性的可用性,您甚至可以从 IB 中配置 View 。只需将 text 属性设置为运行时属性并将 backgroundColor 设置为您想要的圆圈颜色。

User Defined Runtime Attributes

代码如下:

@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

关于ios - 在 iOS 7 中用字母绘制实心圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19651664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com