[英]iPhone - UILabel containing text with multiple fonts at the same time
我正在尋找一種使用UILabel(或類似的東西)來顯示類似這樣的方法:
湯姆:一些消息。
就像在Facebook應用程序中如何顯示“您的想法?” 消息。 有人對如何解決這個問題有任何建議嗎?
有一種方法可以使用NSMutableAttributedString在Label上設置不同/多種字體和其他屬性。 福爾是我的代碼:
UIFont *arialFont = [UIFont fontWithName:@"arial" size:18.0];
NSDictionary *arialDict = [NSDictionary dictionaryWithObject: arialFont forKey:NSFontAttributeName];
NSMutableAttributedString *aAttrString = [[NSMutableAttributedString alloc] initWithString:title attributes: arialDict];
UIFont *VerdanaFont = [UIFont fontWithName:@"verdana" size:12.0];
NSDictionary *verdanaDict = [NSDictionary dictionaryWithObject:VerdanaFont forKey:NSFontAttributeName];
NSMutableAttributedString *vAttrString = [[NSMutableAttributedString alloc]initWithString: newsDate attributes:verdanaDict];
[vAttrString addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:(NSMakeRange(0, 15))];
[aAttrString appendAttributedString:vAttrString];
lblText.attributedText = aAttrString;
請注意,lblText是UILabel,是文件所有者的出口。 一個人可以繼續添加他想要的盡可能多的NSMutableAttributedString。
還要注意,我已經在項目中添加了verdana和arial字體,並為其添加了一個plist。
對不起,我遲到了。 下面的代碼非常適合我。 我發布此信息是為了對某人有所幫助。
UIFont *font1 = [UIFont fontWithName:kMyriadProSemiBold size:15];
NSDictionary *arialDict = [NSDictionary dictionaryWithObject: font1 forKey:NSFontAttributeName];
NSMutableAttributedString *aAttrString1 = [[NSMutableAttributedString alloc] initWithString:@"My" attributes: arialDict];
UIFont *font2 = [UIFont fontWithName:kMyriadProRegular size:15];
NSDictionary *arialDict2 = [NSDictionary dictionaryWithObject: font2 forKey:NSFontAttributeName];
NSMutableAttributedString *aAttrString2 = [[NSMutableAttributedString alloc] initWithString:@"Profile" attributes: arialDict2];
[aAttrString1 appendAttributedString:aAttrString2];
myProfileLabel.attributedText = aAttrString1;
請注意,我是半粗體的,個人資料是常規的。 我使用了MyRiad字體。 謝謝
根據需要使用兩個UILabel IBOutlet,每個都具有不同的格式(字體/顏色/等)。根據第一個文本的結尾位置,將第二個移到第一個之上。 您可以通過sizeWithFont:forWidth:lineBreakMode獲得該信息:
另外,您可以子類化UILabel,然后在drawRect中自己繪制文本。 如果采用這種方式,只需添加一個實例變量即可告訴您以一種格式繪制多少字符串,而以另一種格式繪制其余字符串。
更新:請參閱下面的@Akshay回復。 從iOS6開始,UILabel可以包含NSMutableAttributedString。 當我寫這篇文章時,這是不可用的。
更新:如果您使用的是iOS 6以上版本,請使用UILabel.attributedText-否則...
我創建了這個基本的UIView子類以支持類似的功能。
事物的名單並不支持比它做什么更長的時間,但基本上它允許你管理UILabels的單線 ,只要你想格式化每個。 例如,這使我可以在行中間插入具有不同顏色的文本,並避免使用重量級的UIWebView。
我通過將UIView對象放置在界面中(使用Interface Builder)並將IB中的對象類型設置為MultipartLabel來創建這些對象。 然后在代碼中,根據需要調用updateNumberOfLabels和各種setText選擇器。
// MultipartLabel.m
// MultiLabelLabel
//
// Created by Jason Miller on 10/7/09.
// Copyright 2009 Jason Miller. All rights reserved.
//
#import "MultipartLabel.h"
@interface MultipartLabel (Private)
- (void)updateLayout;
@end
@implementation MultipartLabel
@synthesize containerView;
@synthesize labels;
-(void)updateNumberOfLabels:(int)numLabels;
{
[containerView removeFromSuperview];
self.containerView = nil;
self.containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)] autorelease];
[self addSubview:self.containerView];
self.labels = [NSMutableArray array];
while (numLabels-- > 0) {
UILabel * label = [[UILabel alloc] initWithFrame:CGRectZero];
[self.containerView addSubview:label];
[self.labels addObject:label];
[label release];
}
[self updateLayout];
}
-(void)setText:(NSString *)text forLabel:(int)labelNum;
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
}
[self updateLayout];
}
-(void)setText:(NSString *)text andFont:(UIFont*)font forLabel:(int)labelNum;
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
thisLabel.font = font;
}
[self updateLayout];
}
-(void)setText:(NSString *)text andColor:(UIColor*)color forLabel:(int)labelNum;
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
thisLabel.textColor = color;
}
[self updateLayout];
}
-(void)setText:(NSString *)text andFont:(UIFont*)font andColor:(UIColor*)color forLabel:(int)labelNum;
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
thisLabel.font = font;
thisLabel.textColor = color;
}
[self updateLayout];
}
- (void)updateLayout {
int thisX = 0;
// TODO when it is time to support different sized fonts, need to adjust each y value to line up baselines
for (UILabel * thisLabel in self.labels) {
CGSize size = [thisLabel.text sizeWithFont:thisLabel.font
constrainedToSize:CGSizeMake(9999, 9999)
lineBreakMode:thisLabel.lineBreakMode];
CGRect thisFrame = CGRectMake( thisX, 0, size.width, size.height );
thisLabel.frame = thisFrame;
thisX += size.width;
}
}
- (void)dealloc {
[labels release];
labels = nil;
[containerView release];
containerView = nil;
[super dealloc];
}
@end
在Swift 2.0中,可以按照以下步驟進行操作
//Defining fonts of size and type
let firstfont:UIFont = UIFont(name: "Helvetica Neue", size: 17)!
let boldFont:UIFont = UIFont(name: "HelveticaNeue-Bold", size: 17)!
let thirdFont:UIFont = UIFont(name: "HelveticaNeue-ThinItalic", size: 17)!
//Making dictionaries of fonts that will be passed as an attribute
let firstDict:NSDictionary = NSDictionary(object: firstfont, forKey:
NSFontAttributeName)
let boldDict:NSDictionary = NSDictionary(object: boldFont, forKey:
NSFontAttributeName)
let thirdDict:NSDictionary = NSDictionary(object: thirdFont, forKey:
NSFontAttributeName)
let firstText = "My name is "
let attributedString = NSMutableAttributedString(string: firstText,
attributes: firstDict as? [String : AnyObject])
let boldText = "Rajan"
let boldString = NSMutableAttributedString(string:boldText,
attributes:boldDict as? [String : AnyObject])
let finalText = " iOS"
let finalAttributedString = NSMutableAttributedString(string:
finalText, attributes: thirdDict as? [String : AnyObject])
attributedString.appendAttributedString(boldString)
attributedString.appendAttributedString(finalAttributedString)
myLabel.attributedText = attributedString
編輯
斯威夫特3.0
let firstfont:UIFont = UIFont(name: "Helvetica Neue", size: 17)!
let boldFont:UIFont = UIFont(name: "HelveticaNeue-Bold", size: 17)!
let thirdFont:UIFont = UIFont(name: "HelveticaNeue-ThinItalic", size: 17)!
//Making dictionaries of fonts that will be passed as an attribute
let firstDict:NSDictionary = NSDictionary(object: firstfont, forKey:
NSFontAttributeName as NSCopying)
let boldDict:NSDictionary = NSDictionary(object: boldFont, forKey:
NSFontAttributeName as NSCopying)
let thirdDict:NSDictionary = NSDictionary(object: thirdFont, forKey:
NSFontAttributeName as NSCopying)
let firstText = "My name is "
let attributedString = NSMutableAttributedString(string: firstText,
attributes: firstDict as? [String : AnyObject])
let boldText = "Rajan"
let boldString = NSMutableAttributedString(string:boldText,
attributes:boldDict as? [String : AnyObject])
let finalText = " iOS"
let finalAttributedString = NSMutableAttributedString(string:
finalText, attributes: thirdDict as? [String : AnyObject])
attributedString.append(boldString)
attributedString.append(finalAttributedString)
myLabel.attributedText = attributedString
編輯
迅捷4.0
let firstfont:UIFont = UIFont(name: "Helvetica Neue", size: 17)!
let boldFont:UIFont = UIFont(name: "HelveticaNeue-Bold", size: 17)!
let thirdFont:UIFont = UIFont(name: "HelveticaNeue-ThinItalic", size: 17)!
//Making dictionaries of fonts that will be passed as an attribute
let firstDict:NSDictionary = NSDictionary(object: firstfont, forKey:
NSAttributedString.Key.font as NSCopying)
let boldDict:NSDictionary = NSDictionary(object: boldFont, forKey:
NSAttributedString.Key.font as NSCopying)
let thirdDict:NSDictionary = NSDictionary(object: thirdFont, forKey:
NSAttributedString.Key.font as NSCopying)
let firstText = "My name is "
let attributedString = NSMutableAttributedString(string: firstText,
attributes: firstDict as? [NSAttributedString.Key : Any])
let boldText = "Rajan"
let boldString = NSMutableAttributedString(string:boldText,
attributes:boldDict as? [NSAttributedString.Key : Any])
let finalText = " iOS"
let finalAttributedString = NSMutableAttributedString(string:
finalText, attributes: thirdDict as? [NSAttributedString.Key : Any])
attributedString.append(boldString)
attributedString.append(finalAttributedString)
myLabel.attributedText = attributedString
這看起來像
我更新了@Jason建議的MultipartLabel,添加了contentMode(文本對齊)支持。
#import <Foundation/Foundation.h>
@interface MultipartLabel : UIView {
}
@property (nonatomic,retain) UIView *containerView;
@property (nonatomic,retain) NSMutableArray *labels;
@property (nonatomic) UIViewContentMode contentMode;
- (void)updateNumberOfLabels:(int)numLabels;
- (void)setText:(NSString *)text forLabel:(int)labelNum;
- (void)setText:(NSString *)text andFont:(UIFont*)font forLabel:(int)labelNum;
- (void)setText:(NSString *)text andColor:(UIColor*)color forLabel:(int)labelNum;
- (void)setText:(NSString *)text andFont:(UIFont*)font andColor:(UIColor*)color forLabel:(int)labelNum;
@end
// MultipartLabel.m
// MultipartLabel
//
// Created by Jason Miller on 10/7/09.
// Updated by Laurynas Butkus, 2011
// Copyright 2009 Jason Miller. All rights reserved.
//
#import "MultipartLabel.h"
@interface MultipartLabel (Private)
- (void)updateLayout;
@end
@implementation MultipartLabel
@synthesize containerView;
@synthesize labels;
@synthesize contentMode;
-(void)updateNumberOfLabels:(int)numLabels
{
[containerView removeFromSuperview];
self.containerView = nil;
self.containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)] autorelease];
[self addSubview:self.containerView];
self.labels = [NSMutableArray array];
while (numLabels-- > 0) {
UILabel * label = [[UILabel alloc] initWithFrame:CGRectZero];
label.backgroundColor = self.backgroundColor;
[self.containerView addSubview:label];
[self.labels addObject:label];
[label release];
}
[self updateLayout];
}
-(void)setText:(NSString *)text forLabel:(int)labelNum
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
}
[self updateLayout];
}
-(void)setText:(NSString *)text andFont:(UIFont*)font forLabel:(int)labelNum
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
thisLabel.font = font;
}
[self updateLayout];
}
-(void)setText:(NSString *)text andColor:(UIColor*)color forLabel:(int)labelNum
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
thisLabel.textColor = color;
}
[self updateLayout];
}
- (void)setText:(NSString *)text andFont:(UIFont*)font andColor:(UIColor*)color forLabel:(int)labelNum
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
thisLabel.font = font;
thisLabel.textColor = color;
}
[self updateLayout];
}
- (void)updateLayout {
int thisX;
int thisY;
int totalWidth = 0;
int offsetX = 0;
int sizes[[self.labels count]][2];
int i = 0;
for (UILabel * thisLabel in self.labels) {
CGSize size = [thisLabel.text sizeWithFont:thisLabel.font constrainedToSize:CGSizeMake(9999, 9999)
lineBreakMode:thisLabel.lineBreakMode];
sizes[i][0] = size.width;
sizes[i][1] = size.height;
totalWidth+= size.width;
i++;
}
i = 0;
for (UILabel * thisLabel in self.labels) {
// X
switch (self.contentMode) {
case UIViewContentModeRight:
case UIViewContentModeBottomRight:
case UIViewContentModeTopRight:
thisX = self.frame.size.width - totalWidth + offsetX;
break;
case UIViewContentModeCenter:
thisX = (self.frame.size.width - totalWidth) / 2 + offsetX;
break;
default:
thisX = offsetX;
break;
}
// Y
switch (self.contentMode) {
case UIViewContentModeBottom:
case UIViewContentModeBottomLeft:
case UIViewContentModeBottomRight:
thisY = self.frame.size.height - sizes[i][1];
break;
case UIViewContentModeCenter:
thisY = (self.frame.size.height - sizes[i][1]) / 2;
break;
default:
thisY = 0;
break;
}
thisLabel.frame = CGRectMake( thisX, thisY, sizes[i][0], sizes[i][1] );
offsetX += sizes[i][0];
i++;
}
}
- (void)dealloc {
[labels release];
labels = nil;
[containerView release];
containerView = nil;
[super dealloc];
}
@end
使用CoreText API,它將更快。
這里有幾個例子
基本上,您將要做的事情是:1:創建UIView子類2:在drawRect:方法中添加文本繪制邏輯。
文本繪制邏輯:-您將需要知道“名稱”的范圍,因此,如果Tom :Some message。 是您的字符串,則必須為范圍(0,3)應用不同的字體。
您可以使用CoreText自定義所有內容:)
嗨OHAttributelabel是個好方法。您可以通過以下鏈接引用示例代碼https://github.com/AliSoftware/OHAttributedLabel從中導入OHAttribute框架,您可以如下設置標簽
OHAttributedLabel *lblText;
lblText = [[OHAttributedLabel alloc] initWithFrame:CGRectMake(10,10,100,19)];
lblText.backgroundColor = [UIColor clearColor];
lblText.textAlignment = UITextAlignmentCenter;
lblText.font = [UIFont fontWithName:@"BoschSans-Regular" size:10];
NSString *strText=@"Tom: Some message.";
NSMutableAttributedString* attrStr = [NSMutableAttributedString attributedStringWithString: strText];
NSRange rangeOfSubstring = [strVersion rangeOfString:@“Tom:];
if (rangeOfSubstring.location != NSNotFound) {
[attrStr setFontName:@"BoschSans-BOLD" size:10.0 range:rangeOfSubstring];
}
else {
}
lblText.attributedText = attrStr;
[self.View addSubview: lblText];
一種選擇是使用UIWebView代替UILabel。
示例: http : //iphoneincubator.com/blog/windows-views/display-rich-text-using-a-uiwebview
建立自己的HTML代碼很容易=>
UIWebView *titleAd = [UIWebView alloc] init...;
NSString *cssString = [NSString stringWithFormat:@".title {font-family: HelveticaNeue; text-decoration: bold; font-size: %fpt; color: #4083a9;} .author {font-family: HelveticaNeue; text-decoration: bold; font-size: %fpt; color: #3e4545;}",__FONTSIZE_29__, __FONTSIZE_21__];
NSString *htmlString = [NSString stringWithFormat:@"<html> <head> <style type=\"text/css\"> %@ </style> </head> <body> <p> <span class=\"title\"> %@ </span> <span class=\"author\"> proposé par %@ </span> </p> </body> </html>", cssString, [table title], [table nameOwner]];
[titleAd loadHTMLString:htmlString baseURL:nil];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.