Unfortunately, I no longer have time to maintain this class. Moreover, as since iOS6, UILabel
now natively support NSAttributedStrings
, this component is totally obsolete now (and maintaining it requires a lot of work for little benefit with recent projects all supporting iOS6+).
Note: If you are willing to take the lead and continue to make it evolve, feel free to contact me so I can give you some GIT access ton continue to maintain it.
OHAttributedLabel
If you need only to support iOS6+, you can use UILabel
and its native support for NSAttributedString
, and use my new OHAttributedStringAdditions
pod to build your NSAttributedStrings
more easily.
Note that
OHAttributedLabel
'sNSAttributedString
categories are building CoreText-only compatible strings and are not compatible withUILabel
andUIKit
/TextKit
's handling ofNSAttributedString
introduced in iOS6. That's why you need to useOHAttributedStringAdditions
instead.
iOS6+'s NSAttributedString
and TextKit now supports a wide range of possibilities (making OHAttributedLabel
useless anyway), letting you parse safe HTML, include attachements (images) and links, etc. So it even fits for advanced usages.
See the example project in OHAttributedStringAdditions
repository.
If you still need to support iOS versions 5 or earlier, I strongly recommand the DTCoreText
library by @Cocoanetics as a replacement — which is a way more complete framework that my own library and let you do much more stuff.
Table of Contents
This class allows you to use a UILabel
with NSAttributedStrings
, in order to display styled text with various style (mixed fonts, color, size, ...) in a unique label. It is a subclass of UILabel
which adds an attributedText
property. Use this property, instead of the text
property, to set and get the NSAttributedString
to display.
Note: This class is compatible with iOS4.3+ and has been developped before the release of the iOS6 SDK (before Apple added support for
NSAttributedLabel
in theUILabel
class itself). It can still be used with the iOS6 SDK (theattributedText
property hopefully match the one chosen by Apple) if you need support for eariler iOS versions or for the additional features it provides.
This class also support hyperlinks and URLs. It can automatically detect links in your text, color them and make them touchable; you can also add "custom links" in your text by attaching an URL to a range of your text and thus make it touchable, and even then catch the event of a touch on a link to act as you wish to.
In addition to this OHAttributedLabel
class, you will also find a category of NS(Mutable)AttributedString
to ease creation and manipulation of common attributes of NSAttributedString
(to easily change the font, style, color, ... of a range of the string). See the header file NSAttributedString+Attributes.h
for a list of those comodity methods.
Example:
// Build an NSAttributedString easily from a NSString
NSMutableAttributedString* attrStr = [NSMutableAttributedString attributedStringWithString:txt];
// Change font, text color, paragraph style
[attrStr setFont:[UIFont fontWithName:@"Helvetica" size:18]];
[attrStr setTextColor:[UIColor grayColor]];
OHParagraphStyle* paragraphStyle = [OHParagraphStyle defaultParagraphStyle];
paragraphStyle.textAlignment = kCTJustifiedTextAlignment;
paragraphStyle.lineBreakMode = kCTLineBreakByWordWrapping;
paragraphStyle.firstLineHeadIndent = 30.f; // indentation for first line
paragraphStyle.lineSpacing = 3.f; // increase space between lines by 3 points
[attrStr setParagraphStyle:paragraphStyle];
// Change the color and bold of only one part of the string
[attrStr setTextColor:[UIColor redColor] range:NSMakeRange(10,3)];
[attrStr setTextBold:YES range:NSMakeRange(10,8)];
// Add a link to a given portion of the string
[attrStr setLink:someNSURL range:NSMakeRange(8,20)];
There is also a category for NSTextCheckingResult
that adds the extendedURL
property. This property returns the same value as the URL
value for standard link cases, and return a formatted Maps URL for NSTextCheckingTypeAddress
link types, that will open Google Maps in iOS version before 6.0 and the Apple's Maps application in iOS 6.0 and later.
The library also comes with very simple tag parsers to help you build NSAttributedStrings
easily using very simple tags.
OHASBasicHTMLParser
can parse simple HTML tags like <b>
and <u>
to make bold and underlined text, change the font color using <font color='…'>
, etcthe class OHASBasicMarkupParser
can parse simple markup like *bold text*
, _underlined text_
and change the font color using markup like {red|some red text}
or {#ff6600|Yeah}
.
// Example 1: parse HTML in attributed string
basicMarkupLabel.attributedText = [OHASBasicHTMLParser attributedStringByProcessingMarkupInAttributedString:basicMarkupLabel.attributedText];
// Example 2: parse basic markup in string
NSAttributedString* as = [OHASBasicMarkupParser attributedStringByProcessingMarkupInString:@"Hello *you*!"];
// Example 3: //process markup in-place in a mutable attributed string
NSMutableAttributedString* mas = [NSMutableAttributedString attributedStringWithString:@"Hello *you*!"];
[OHASBasicMarkupParser processMarkupInAttributedString:mas];
Note that OHASBasicHTMLParser
is intended to be a very simple tool only to help you build attributed string easier: this is not intended to be a real and complete HTML interpreter, and will never be. For improvements of this feature, like adding other tags or markup languages, refer to issue #88)
The OHAttributedLabel
class support the UIAppearance
proxy API (available since iOS5). See selectors and properties marked using the UI_APPEARANCE_SELECTOR
in the header.
This means that if you are targetting iOS5, you can customize all of your OHAttributedLabel
links color and underline style to fit your application design, only in one call at the beginning of your application, instead of having to customize these for each instance.
For example, your could implement this in your application:didFinishLoadingWithOptions:
delegate method to make all your OHAttributedLabel
instances in your whole app display links in green and without underline instead of the default underlined blue:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[ [OHAttributedLabel appearance] setLinkColor:[UIColor colorWithRed:0.0 green:0.4 blue:0.0 alpha:1.0] ];
[ [OHAttributedLabel appearance] setLinkUnderlineStyle:kCTUnderlineStyleNone ];
return YES;
}
There are three possible methods to include these classes in your project:
Using Cocoapods:
pod "OHAttributedLabel"
to your PodfileInclude OHAttributedLabel in your project:
OHAttributedLabel.xcodeproj
project in your Xcode4 workspaceOHAttributedLabel.xcodeproj
project once for the "iOS Device" (not the simulator) (1)libOHAttributedLabel.a
and CoreText.framework
to your "Link Binary With Libraries" Build Phase of your app project.libOHAttributedLabel.a
that has just been added to your app project in your Project Navigator on the left, and change the "Location" dropdown in the File Inspector to "Relative to Build Products" (1)-ObjC
flag in the "Other Linker Flags" Build Setting (if not present already)Add libOHAttributedLabel.a
and headers in your project
cd OHAttributedLabel
make clean && make
(nb. rvm users may need to CC= && make clean && make
)build/Release-Combined
directory to you project (eg. ThirdParty/OHAttributedLabel
)libOHAttributedLabel.a
and CoreText.framework
to your "Link Binary With Libraries" Build Phase of your app project."$(SRCROOT)/ThirdParty/OHAttributedLabel/include/**"
)-ObjC
flag in the "Other Linker Flags" Build Setting (if not present already)Then in your application code, when you want to make use of OHAttributedLabel methods, you only need to import the headers with #import <OHAttributedLabel/OHAttributedLabel.h>
or #import <OHAttributedLabel/NSAttributedString+Attributes.h>
etc.
(1) Note: These two steps are only necessary to avoid a bug in Xcode4 that would otherwise make Xcode fail to detect implicit dependencies between your app and the lib.
For more details and import/linking troubleshooting, please see the dedicated page.
There is no explicit docset or documentation of the class yet sorry (never had time to write one), but
OHAttributedLabel
is published under the MIT license.
It has been created and developped by me (O.Halligon), but I'd like to thank all the contributors too, including @mattjgalloway, @stigi and @jparise among others.
The ChangeLog is maintained as a wiki page accessible here.
Here is a non-exhaustive list of the projects that use this class (for those who told me about it) Feel free to contact me if you use this class so we can cross-reference our projects and quote your app in this dedicated wiki page!