作用:将一段文本根据url拆分出几个字符串存放在一个数组中,比如:xxxhttp://abc.com xxxxxx 拆分成xxx;http://abc.com;xxxxxx;3个字符串存放在数组中
- (NSMutableArray *)splitStringByUrl:(NSString *)source;
- (NSMutableArray *)splitStringBylimitWidth:(CGFloat)width source:(NSString *)source;
- (NSInteger)findStartIndexOfLastLine
- (CGSize)sizeForString:(NSString *)string;
- (CGFloat)getHeightWithFontSize:(CGFloat)fontSize;
- (void)layoutURLViewWithElement
- (void)setFrame;
- (void)setUrlLabelTextColorWith
- (NSMutableArray *)splitStringByUrl:(NSString *)source {
[source retain];
NSMutableArray *elementsArray = [[[NSMutableArray alloc] init] autorelease];
NSInteger index = 0;
while (index < source.length) {
NSRange searchRange = NSMakeRange(index, source.length - index);
NSRange startRange = [source rangeOfString:@"http://" options:NSCaseInsensitiveSearch range:searchRange];
if (startRange.location == NSNotFound) {
DSStyleString *currentElement = [[DSStyleString alloc] init];
currentElement.isUrl = NO;
currentElement.string = [source substringWithRange:searchRange];
[elementsArray addObject:currentElement];
break;
}else {
NSRange beforeRange = NSMakeRange(searchRange.location, startRange.location - searchRange.location);
if (beforeRange.length) {
DSStyleString *beforeElement = [[DSStyleString alloc] init];
beforeElement.isUrl = NO;
beforeElement.string = [source substringWithRange:beforeRange];
[elementsArray addObject:beforeElement];
}
NSRange searchRange = NSMakeRange(startRange.location, source.length - startRange.location);
NSRange endRange = [source rangeOfString:@" " options:NSCaseInsensitiveSearch range:searchRange];
if (endRange.location == NSNotFound) {
DSStyleString *urlElement = [[DSStyleString alloc] init];
urlElement.isUrl = YES;
urlElement.string = [source substringWithRange:searchRange];
[elementsArray addObject:urlElement];
break;
}else {
NSRange urlRange = NSMakeRange(startRange.location, endRange.location - startRange.location);
DSStyleString *urlElement = [[DSStyleString alloc] init];
urlElement.isUrl = YES;
urlElement.string = [source substringWithRange:urlRange];
[elementsArray addObject:urlElement];
index = endRange.location;
}
}
}
[source release];
return elementsArray;
}
- (void)layoutURLViewWithElement
[elements retain];
NSInteger count = [elements count];
if (count == 0) return;
BOOL haveHttp = NO;
for (DSStyleString *styleString in elements) {
if (styleString.isUrl == YES) {
haveHttp = YES;
break;
}
}
if (haveHttp == YES) {
for (int i = 0; i < count; i ++) {
DSStyleString *styleString = (DSStyleString *)[elements objectAtIndex:i];
NSArray *existSubViews = [self subviews];
if ([existSubViews count] > 0) {
UIView *lastSubView = [existSubViews lastObject];
NSString *forwardSourceString = nil;
NSString *lastLineStringOfForwardS
NSInteger lastLineStringWidthOfFor
NSInteger leaveWidth = 0;
CGFloat originX = 0;
CGFloat originY = 0;
CGFloat width = 0;
CGFloat height = 0;
CGFloat characterHeight = [self getHeightWithFontSize:FontSize];
if ([[lastSubView class] isSubclassOfClass:[UILabel class]]) {
forwardSourceString = [(UILabel *)lastSubView text];
}else if ([[lastSubView class] isSubclassOfClass:[DSURLLabel class]]) {
forwardSourceString = [[(DSURLLabel *)lastSubView urlLabel] text];
}
CGSize forwardSourceStringSize = [self sizeForString:forwardSourceString];
lastLineStringOfForwardS
CGSize lastLineStringOfForwardS
lastLineStringWidthOfFor
if (forwardSourceStringSize.height > characterHeight) {
leaveWidth = _frameWidth - lastLineStringOfForwardS
}else {
leaveWidth = _frameWidth - lastSubView.frame.origin.x - lastSubView.frame.size.width;
}
NSMutableArray *splitedSubStringByLimitW
[splitedSubStringByLimitW
if ([splitedSubStringByLimitW
if (_needNewLine) {
originX = 0;
originY = lastSubView.frame.origin.y + lastSubView.frame.size.height;
}else {
if (forwardSourceStringSize.height > characterHeight) {
originX = lastLineStringOfForwardS
}else {
originX = lastSubView.frame.origin.x + lastSubView.frame.size.width;
}
originY = lastSubView.frame.origin.y + lastSubView.frame.size.height - characterHeight;
}
CGSize newLabelSize = [self sizeForString:styleString.string];
width = newLabelSize.width;
height = newLabelSize.height;
if (styleString.isUrl == YES) {
DSURLLabel *urlLabel = [[DSURLLabel alloc] initWithFrame:CGRectMake(originX, originY, width, height)];
urlLabel.backgroundColor = [UIColor clearColor];
urlLabel.urlString = styleString.string;
urlLabel.urlLabel.text = styleString.string;
urlLabel.urlLabel.numberOfLines = 0;
urlLabel.urlLabel.lineBreakMode = LineBreakMode;
urlLabel.urlLabel.font = [UIFont systemFontOfSize:FontSize];
urlLabel.delegate = self;
[self addSubview:urlLabel];
[urlLabel release];
}else {
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(originX, originY, width, height)];
textLabel.numberOfLines = 0;
textLabel.lineBreakMode = LineBreakMode;
textLabel.font = [UIFont systemFontOfSize:FontSize];
textLabel.backgroundColor = [UIColor clearColor];
textLabel.text = styleString.string;
[self addSubview:textLabel];
[textLabel release];
}
}else if ([splitedSubStringByLimitW
for(int i = 0; i < 2; i++) {
NSString *currentSubString = [splitedSubStringByLimitW
CGSize newLabelSize = [self sizeForString:currentSubString];
if (i == 0) {
if (forwardSourceStringSize.height > characterHeight) {
originX = lastLineStringOfForwardS
}else {
originX = lastSubView.frame.origin.x + lastSubView.frame.size.width;
}
originY = lastSubView.frame.origin.y + lastSubView.frame.size.height - characterHeight;
width = _frameWidth - originX;
}else if (i == 1) {
originX = 0;
originY = lastSubView.frame.origin.y + lastSubView.frame.size.height;
width = newLabelSize.width;
}
height = newLabelSize.height;
if (styleString.isUrl == YES) {
DSURLLabel *urlLabel = [[DSURLLabel alloc] initWithFrame:CGRectMake(originX, originY, width, height)];
urlLabel.backgroundColor = [UIColor clearColor];
urlLabel.urlString = styleString.string;
urlLabel.urlLabel.text = currentSubString;
urlLabel.urlLabel.font = [UIFont systemFontOfSize:FontSize];
urlLabel.urlLabel.lineBreakMode = LineBreakMode;
if (i == 0) {
urlLabel.urlLabel.numberOfLines = 1;
}else if (i == 1) {
urlLabel.urlLabel.numberOfLines = 0;
}
urlLabel.delegate = self;
[self addSubview:urlLabel];
[urlLabel release];
}else {
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(originX, originY, width, height)];
textLabel.backgroundColor = [UIColor clearColor];
textLabel.font = [UIFont systemFontOfSize:FontSize];
textLabel.lineBreakMode = LineBreakMode;
if (i == 0) {
textLabel.numberOfLines = 1;
}else if (i == 1) {
textLabel.numberOfLines = 0;
}
textLabel.text = currentSubString;
[self addSubview:textLabel];
[textLabel release];
}
}
}
[splitedSubStringByLimitW
}else {
CGSize newLabelSize = [self sizeForString:styleString.string];
if (styleString.isUrl == YES) {
DSURLLabel *urlLabel = [[DSURLLabel alloc] initWithFrame:CGRectMake(0, 0, newLabelSize.width, newLabelSize.height)];
urlLabel.backgroundColor = [UIColor clearColor];
urlLabel.urlLabel.font = [UIFont systemFontOfSize:FontSize];
urlLabel.urlLabel.numberOfLines = 0;
urlLabel.urlLabel.lineBreakMode = LineBreakMode;
urlLabel.urlString = styleString.string;
urlLabel.urlLabel.text = styleString.string;
urlLabel.delegate = self;
[self addSubview:urlLabel];
[urlLabel release];
}else {
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, newLabelSize.width, newLabelSize.height)];
label.backgroundColor = [UIColor clearColor];
label.text = styleString.string;
label.font = [UIFont systemFontOfSize:FontSize];
label.numberOfLines = 0;
label.lineBreakMode = LineBreakMode;
[self addSubview:label];
[label release];
}
}
}
}else {
DSStyleString *styleString = [elements objectAtIndex:0];
CGSize textSize = [self sizeForString:styleString.string];
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, textSize.width, textSize.height)];
textLabel.numberOfLines = 0;
textLabel.backgroundColor = [UIColor clearColor];
textLabel.lineBreakMode = LineBreakMode;
textLabel.text = _sourceText;
textLabel.font = [UIFont systemFontOfSize:FontSize];
[self addSubview:textLabel];
[textLabel release];
}
[self setFrame];
[elements release];
}
- (void)setFrame {
UIView *lastSubView = (UIView *)[[self subviews] lastObject];
CGFloat heigh = lastSubView.frame.origin.y + lastSubView.frame.size.height;
self.frame = CGRectMake(_frameOriginX, _frameOriginY , _frameWidth, heigh);
}
- (NSInteger)findStartIndexOfLastLine
[source retain];
CGSize sourceTextSize = [self sizeForString:source];
NSInteger lines = sourceTextSize.height / [self getHeightWithFontSize:FontSize];
NSInteger startIndex = 0;
if (lines > 1) {
NSInteger length = [source length];
for (int i = length; i > 0; i --) {
CGSize textSize = [self sizeForString:[source substringToIndex:i]];
if (textSize.height < sourceTextSize.height) {
startIndex = i;
break;
}
}
}
[source release];
return startIndex;
}
- (NSMutableArray *)splitStringBylimitWidth:(CGFloat)width source:(NSString *)source {
[source retain];
NSMutableArray *subStrings = [[[NSMutableArray alloc] init] autorelease];
NSInteger length = [source length];
for (int i = length; i > 0; i--) {
CGSize textSize = [self sizeForString:[source substringToIndex:i]];
if (textSize.width <= width && i == length) {
[subStrings addObject:source];
_needNewLine = NO;
break;
}
if ((textSize.width < width) && (textSize.height == [self getHeightWithFontSize:FontSize])) {
[subStrings addObject:[source substringToIndex:i]];
[subStrings addObject:[source substringFromIndex:i]];
break;
}
if (i == 1) {
[subStrings addObject:source];
_needNewLine = YES;
break;
}
}
[source release];
return subStrings;
}
- (CGSize)sizeForString:(NSString *)string {
CGSize textSize = [string sizeWithFont:[UIFont systemFontOfSize:FontSize]constrainedToSize:CGSizeMake(_frameWidth, 10000.0f) lineBreakMode:LineBreakMode];
return textSize;
}
- (CGFloat)getHeightWithFontSize:(CGFloat)fontSize {
NSString *character = @" ";
CGSize characterSize = [self sizeForString:character];
return characterSize.height;
}
- (void)setUrlLabelTextColorWith
NSArray *subViews = [self subviews];
for (UIView *subView in subViews) {
if ([[subView class] isSubclassOfClass:[DSURLLabel class]]) {
if ([((DSURLLabel *)subView).urlString isEqualToString:url]) {
((DSURLLabel *)subView).urlLabel.textColor = color;
}
}
}
}
#pragma mark -
#pragma mark DSURLLabelDelegate methods
- (void)urlTouchesBegan:(DSURLLabel *)urlLabel {
[self setUrlLabelTextColorWith
}
- (void)urlTouchesEnd:(DSURLLabel *)urlLabel {
[self setUrlLabelTextColorWith
if (_delegate && [(NSObject *)_delegate respondsToSelector:@selector(urlWasClicked:urlString:)]) {
[_delegate urlWasClicked:self urlString:urlLabel.urlString];
}
}