問題:
1.如何銷毀單例?
我回答了:先清空里面的數據再把單例=nil。
我呆逼了,不知道當時的腦袋里怎么不斷的浮現以前是賦值過而且也沒有問題的,后來實驗了真的會報錯,后來去查了,一般單例我們是不用管理和銷毀的,要是需要手動銷毀那也不叫單例了。
2.問了一個要實現一個動態加那個(自營)的文字.如效果圖
test.png
我回答了:可以使用NSAttributedString/NSTextAttachment/YYText/結合兩個控件都可以實現。后來也說不出一個所以然來。
事后回去驗證了一下:
(1)NSAttributedString/NSTextAttachment 這兩個我都做不到那個效果,也許是我對他們沒有深入的了解。
(2)YYText我沒去試,不過我相信它絕對可以~~~
(3)我用了兩個控件實現了,如下:
#import "ViewController.h"
#import <CoreText/CoreText.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIFont *font = [UIFont systemFontOfSize:12];
NSString *test= @"好東西好東西大特賣啊大特大特賣快來吧來啊水大特賣快來吧啊好東西好東西大特賣啊大特大特賣快來吧啊水是大特";
NSString *ziying = @"自營";
CGSize size2 = [test boundingRectWithSize:CGSizeMake(self.view.frame.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size;
//創建文本Label
UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, self.view.frame.size.width , size2.height)];
label.text = test;
label.font = font;
label.numberOfLines = 0;
label.backgroundColor = [UIColor grayColor];
[self.view addSubview:label];
//獲取文字數組
NSArray *array = [self.class getSeparatedLinesFromLabel:label];
//最后一行文字的Size
CGSize lastSize = [[array lastObject] boundingRectWithSize:CGSizeMake(self.view.frame.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size;
//自營size
CGSize ziyingSize = [ziying boundingRectWithSize:CGSizeMake(self.view.frame.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size;
//創建 自營 標簽
UILabel * ziyingLabel = [[UILabel alloc]init];
ziyingLabel.text = ziying;
ziyingLabel.textColor = [UIColor whiteColor];
ziyingLabel.font = font;
ziyingLabel.layer.backgroundColor = [UIColor blueColor].CGColor;
ziyingLabel.layer.cornerRadius = 3;
[self.view addSubview:ziyingLabel];
//計算frame
if(lastSize.width + 5 + ziyingSize.width >= self.view.frame.size.width){
ziyingLabel.frame = CGRectMake(CGRectGetMinX(label.frame), CGRectGetMaxY(label.frame), ziyingSize.width, ziyingSize.height);
}else{
ziyingLabel.frame = CGRectMake(lastSize.width + 5, CGRectGetMaxY(label.frame)- lastSize.height, ziyingSize.width, ziyingSize.height);
}
[self.view addSubview:ziyingLabel];
}
/**
* 切割每一行文字
*
* @param label 需要切換的控件
*
* @return 每一行文字數組
*/
+ (NSArray *)getSeparatedLinesFromLabel:(UILabel *)label
{
NSString *text = [label text];
UIFont *font = [label font];
CGRect rect = [label frame];
CTFontRef myFont = CTFontCreateWithName((__bridge CFStringRef)([font fontName]), [font pointSize], NULL);
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
[attStr addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)myFont range:NSMakeRange(0, attStr.length)];
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attStr);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0,0,rect.size.width,100000));
CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);
NSArray *lines = (__bridge NSArray *)CTFrameGetLines(frame);
NSMutableArray *linesArray = [[NSMutableArray alloc]init];
for (id line in lines)
{
CTLineRef lineRef = (__bridge CTLineRef )line;
CFRange lineRange = CTLineGetStringRange(lineRef);
NSRange range = NSMakeRange(lineRange.location, lineRange.length);
NSString *lineString = [text substringWithRange:range];
[linesArray addObject:lineString];
}
return (NSArray *)linesArray;
}
@end
沒有做過多的封裝,只是單純的把功能給實現了。方法就是拿到最后一行文字的高度進行判斷一下就好了。