2010-06-08 10 views
5

Tôi đã sử dụng CGContextSetShadowWithColor() trong mã bản vẽ Quartz của mình trên iPhone để tạo giao diện "dậm chân" cho văn bản và những thứ khác (trong drawRect:drawLayer:inContext:).CGContextSetShadow() - hướng bóng được đảo ngược giữa iOS 3.0 và 4.0?

Làm việc hoàn hảo, nhưng khi chạy chính xác mã tương tự với iOS 3.2 và bây giờ iOS 4.0, tôi nhận thấy rằng các bóng là tất cả theo hướng ngược lại. Ví dụ. trong đoạn mã sau, tôi đặt một bóng đen là 1 pixel ở trên văn bản, cho giao diện "được nhấn" và bây giờ bóng này là 1px bên dưới văn bản, tạo cho nó một bóng tiêu chuẩn.

... 
CGContextSetShadowWithColor(context, CGSizeMake(0.f, 1.f), 0.5f, shadowColor); 
CGContextShowGlyphsAtPoint(context, origin.x, origin.y, glyphs, length); 
... 

Bây giờ tôi không biết mình (hoặc đã) đang làm điều gì sai hoặc liệu có thay đổi gì đối với việc xử lý cài đặt này hay không. Tôi đã không áp dụng bất kỳ chuyển đổi nào có thể giải thích điều này với tôi, ít nhất là không cố ý. Tôi đã lật ma trận văn bản trong một trường hợp, nhưng không phải trong trường hợp khác và hành vi này là nhất quán. Plus tôi đã không thể tìm thấy bất cứ điều gì về điều này trong Ghi chú phát hành SDK, vì vậy có vẻ như nó có thể là tôi. Điều gì có thể là vấn đề?

+1

Tôi đã gặp sự cố tương tự trong ứng dụng của mình. Tôi sẽ nhận thấy nếu đồ họa của tôi bị lộn ngược, vì vậy tôi biết nó không phải là một sự kỳ quặc với ma trận biến đổi. Lỗi hệ điều hành có vẻ giống như lời giải thích duy nhất. – qrunchmonkey

Trả lời

3

Vì vậy, có vẻ như đó là lỗi hoặc cố ý của Apple; một trong hai cách để giải quyết vấn đề này, tôi hiện đang sử dụng danh mục UIView. Tôi thiết lập hướng bóng Y như nó phải trên iOS 3.2+, nhưng miễn là tôi đang hỗ trợ iOS < 3.2 Tôi sẽ sử dụng phương thức lớp sau đây để nhân hướng hoặc bằng 1 hoặc -1, khi cần thiết bởi thiết bị:

... 
CGContextSetShadowWithColor(context, CGSizeMake(0.f, [UIView shadowVerticalMultiplier] * -1.f), 0.5f, textShadowColor); 
... 

Dưới đây là các loại:

@interface UIView (shadowBug) 

+ (NSInteger) shadowVerticalMultiplier;  

@end 


@implementation UIView (shadowBug) 

+ (NSInteger) shadowVerticalMultiplier 
{ 
    static NSInteger shadowVerticalMultiplier = 0; 
    if (0 == shadowVerticalMultiplier) { 
     CGFloat systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; 
     shadowVerticalMultiplier = (systemVersion < 3.2f) ? -1 : 1; 
    } 

    return shadowVerticalMultiplier; 
} 


@end 
0

Đó là một lỗi mà họ đã không nhận được xung quanh để sửa chữa, có vẻ như. :)

0

iOS 4.0 có thay đổi tương tự này trong hành vi (tôi tìm thấy con đường của tôi ở đây bằng cách tìm kiếm trên CGContextSetShadow khi cập nhật ứng dụng iPhone của tôi cho 4.0). Vì vậy, rõ ràng CGContextSetShadow hoạt động theo một cách nếu bạn liên kết với iPhone OS 3.1.3 và trước đó, và một cách khác nếu bạn liên kết với iPhone OS 3.2 trở lên.

+0

Chính xác. Điều tốt là bạn có thể chỉ cần kiểm tra xem thiết bị hiện tại có chạy <3.2 và hành động tương ứng hay không, như tôi đã làm trong danh mục của mình, vì vậy ít nhất điều này là nhất quán. – Pascal

+0

Có vẻ như ngay cả khi bạn liên kết với một SDK cũ hơn, sự đảo ngược sẽ xảy ra - hãy xem các bóng được đảo ngược của Ứng dụng Facebook! –