Dự án ví dụ Finder Icon Overlay đại diện cho một ví dụ nhỏ và rất cơ bản nhưng thực sự hoạt động của câu trả lời bên dưới.
https://github.com/lesnie/Finder-Icon-Overlay
Tôi biết điều này là rất cũ, nhưng một số có thể vẫn còn quan tâm đến chủ đề (?)
Dưới đây là những gì tôi có nó thực hiện dưới Leopard (10.6). Đầu tiên, cần có các tiêu đề phù hợp của Finder. Sử dụng công cụ đổ lớp để lấy nó. Sau đó viết mã của bạn như một plugin SIMBL (tham khảo tài liệu hướng dẫn cách thực hiện), một số phương pháp. Ví dụ để vẽ một cái gì đó trên biểu tượng trong ListView, drawIconWithFrame: phương pháp của phương pháp TIconAndTextCell phải được overriden.
Dưới đây là các mã cho phương pháp swizzling:
+ (void) Plugin_load
{
Method old, new;
Class self_class = [self class];
Class finder_class = [objc_getClass("TIconAndTextCell") class];
class_addMethod(finder_class, @selector(FT_drawIconWithFrame:),
class_getMethodImplementation(self_class, @selector(FT_drawIconWithFrame:)),"[email protected]:{CGRect={CGPoint=dd}{CGSize=dd}}");
old = class_getInstanceMethod(finder_class, @selector(drawIconWithFrame:));
new = class_getInstanceMethod(finder_class, @selector(FT_drawIconWithFrame:));
method_exchangeImplementations(old, new);
}
Tôi trọng "drawIconWithFrame:" phương pháp với phương pháp của tôi "FT_drawIconWithFrame:". Dưới đây là triển khai mẫu cho phương pháp này.
- (void) FT_drawIconWithFrame:(struct CGRect)arg1
{
[self FT_drawIconWithFrame:arg1];
if ([self respondsToSelector:@selector(node)]) {
if ([[[[NSClassFromString(@"FINode") nodeWithFENode:[(TNodeIconAndNameCell *)self node]] fullPath] lastPathComponent] hasPrefix:@"A"])
[myPrettyIconOverlayImage drawInRect:NSMakeRect(arg1.origin.x, arg1.origin.y, arg1.size.height, arg1.size.height) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
}
}
Về cơ bản nó vẽ "myPrettyIconOverlayImage" trên mọi biểu tượng cho tệp có tên bắt đầu bằng chữ "A". Logic này tùy thuộc vào bạn.
Chú ý đến dòng này: [self FT_drawIconWithFrame:arg1];
đây là cách gọi 'siêu' để nhận biểu tượng và tên bình thường, v.v. Tôi biết, trông kỳ quặc, giống như vòng lặp, nhưng thực ra không phải vậy. Sau đó, đưa vào SIMBL plugin, cài đặt SIMBL và ... chạy.
Do những thay đổi trong Lion, một số công việc phải được thực hiện ngay từ đầu (tạo tệp "Finder.h" mới với tất cả các khai báo cần thiết, tìm lớp thích hợp và phương pháp để ghi đè), nhưng kỹ thuật này vẫn hoạt động.
Hacking vui vẻ!
Đã lâu rồi kể từ khi đăng bài này, với 10.6 sẵn có. Bạn đã đạt được những gì bạn đang cố gắng? Bạn đã đi với chiến thuật plugin của Trình tìm kiếm chưa? – epologee
Mọi cập nhật về điều này cho sư tử? – Tony
@LesNie bên dưới liên kết với dự án [Finder Icon Overlay] (https://github.com/lesnie/Finder-Icon-Overlay) của anh ấy. Liên kết trong trường hợp bất kỳ ai khác gặp khó khăn khi tìm một ví dụ về Plugin tìm kiếm OS X nguồn mở (như tôi đã làm). – pkamb