最近在做NSTextView中顯示自定義NSTextAttachment的時(shí)候,發(fā)現(xiàn)顯示自定義Attachment中的圖片總是顛倒的,如下圖。
image.png
查閱資料后發(fā)現(xiàn)是坐標(biāo)系導(dǎo)致的,APPKit中那些[ isFlipped]方法返回YES的控件大多都會(huì)出現(xiàn)這種問題孕讳。
如果你去繼承一個(gè)TextView重寫以下方法
- (BOOL)isFlipped{
return NO;
}
會(huì)發(fā)現(xiàn)圖片顛倒問題解決了,但是TextView的排版從左下角開始了巍膘,也就是打字是從左下角開始出現(xiàn)厂财,而非平時(shí)的左上角一行一行往下添加。所以重寫這個(gè)坐標(biāo)系的方法是不可行的峡懈。
解決的方法有兩種
1.直接調(diào)用方法設(shè)置是否顛倒
- (instancetype)initWithEmotion:(Emotion *)emotion
emotionBounds:(CGRect)emotionBounds
{
self = [super init];
if (self) {
_emotion = emotion;
self.bounds = emotionBounds;
NSImage *image = _emotion.emotionImage.copy;
[image setFlipped:YES];
//10.6以后就廢棄的方法 目前在10.13.2 (17C88)上測試仍然生效
//不推薦使用
self.image = image;
}
return self;
}
使用該方法簡單粗暴璃饱,一句解決。但是因?yàn)檫@個(gè)方法已經(jīng)廢棄肪康,說不準(zhǔn)什么時(shí)候就會(huì)失效荚恶,所以不是很推薦
2.利用NSAffineTransform旋轉(zhuǎn)、反轉(zhuǎn)圖片
我一開始以為這個(gè)坐標(biāo)系導(dǎo)致的顛倒問題只是旋轉(zhuǎn)了180磷支,但是經(jīng)過嘗試旋轉(zhuǎn)180度以后才發(fā)現(xiàn)這個(gè)顛倒其實(shí)是豎直方向的鏡像谒撼,所以如果用旋轉(zhuǎn)的方法只是旋轉(zhuǎn)沒用,還需要再來一次水平方向的反轉(zhuǎn)雾狈±保或者直接進(jìn)行豎直方向的反轉(zhuǎn)。
- (instancetype)initWithEmotion:(Emotion *)emotion
emotionBounds:(CGRect)emotionBounds
{
self = [super init];
if (self) {
_emotion = emotion;
self.bounds = emotionBounds;
self.image = [self turnUpsideDownAndMirrorSourceImage:_emotion.emotionImage];
}
return self;
}
- (NSImage *)turnUpsideDownAndMirrorSourceImage:(NSImage *)sourceImage
{
NSSize srcSize = [sourceImage size];
float srcw = srcSize.width;
float srch= srcSize.height;
if((!sourceImage) || srcw == 0 || srch == 0)
{
return nil;
}
NSRect rotateRect = NSMakeRect(0, 0, srcw, srch);
NSImage *rotatedImage = [[NSImage alloc] initWithSize:srcSize];
[rotatedImage lockFocus];
NSAffineTransform *transform = [NSAffineTransform transform];
//方法一:180度旋轉(zhuǎn)
//其實(shí)直接用下面的方法就可以了善榛,但是查資料的過程發(fā)現(xiàn)旋轉(zhuǎn)的資料也比較少辩蛋,順便就一起放出來了,有需要可以根據(jù)情況修改旋轉(zhuǎn)角度
float rotateDeg = 180;
[transform translateXBy:(0.5 * srcw) yBy: ( 0.5 * srch)]; //將坐標(biāo)系原點(diǎn)移至圖片中心點(diǎn)
[transform rotateByDegrees:rotateDeg];//以圖片中心為原點(diǎn)移盆,旋轉(zhuǎn)傳入的度數(shù)
[transform translateXBy:(-0.5 * srcw) yBy: (- 0.5 * srch)]; //將坐標(biāo)系回復(fù)原狀
//水平鏡像反轉(zhuǎn)
[transform scaleXBy:-1.0 yBy:1.0];
[transform translateXBy:-srcw yBy:0];
//方法二:豎直鏡像反轉(zhuǎn)
// [transform scaleXBy:1.0 yBy:-1.0];
//
// [transform translateXBy:0 yBy:-srch];
[transform concat];
[sourceImage drawInRect:rotateRect fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];
[rotatedImage unlockFocus];
return rotatedImage;
}
image.png
mac資料查閱不易悼院,如果對(duì)你有幫助請(qǐng)點(diǎn)個(gè)贊啦~