iOS画像フィレット処理
3472 ワード
フィレットの処理
AsyncDisplayKit
からのDeomo SocialAppLayout
これは新浪微博、appのようなレイアウトの単一ページです.顔が丸みであることはよく知られていますが、layerを使用して丸みを処理すると、性能が損なわれるに違いありません.次に、SocialAppLayoutがどのようにしたかを見てみましょう.興味のある方はgitからコードをダウンロードしてみてください.
// User pic Node node , , , 。
_avatarNode = [[ASNetworkImageNode alloc] init];
///
_avatarNode.imageModificationBlock = ^UIImage *(UIImage *image) {
UIImage *modifiedImage;
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContextWithOptions(image.size, false, [[UIScreen mainScreen] scale]);
[[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:44.0] addClip];
[image drawInRect:rect];
modifiedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return modifiedImage;
};
imageModificationBlockは、ピクチャ復号が完了した後に呼び出されます.ここで、パラメータimageは復号後の正方形ピクチャです.
に合格
[[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:44.0] addClip];
フィレットを設定します.(PS:プロジェクトで直接使用可能).
もちろん毎回フィレットの処理をするわけではありませんが、キャッシュはやはりします.
……
/// ASWeakMapEntry
ASWeakMapEntry *entry = [self.class contentsForkey:contentsKey isCancelled:(asdisplaynode_iscancelled_block_t)isCancelled];
if (entry == nil) { // If nil, we were cancelled.
return nil;
}
_weakCacheEntry = entry; // Retain so that the entry remains in the weak cache
……
ASWeakMapEntry
の声明は以下の通りである.@interface ASWeakMapEntry : NSObject
@property (nonatomic, retain, readonly) Value value;
@end
ここにはUIImageオブジェクトが1つしか保存されていません.
キャッシュから画像を取得する手順を見てみましょう
+ (ASWeakMapEntry *)contentsForkey:(ASImageNodeContentsKey *)key isCancelled:(asdisplaynode_iscancelled_block_t)isCancelled
{
{
ASDN::MutexLocker l(cacheLock);
if (!cache) {
cache = [[ASWeakMap alloc] init];
}
/// ,
ASWeakMapEntry *entry = [cache entryForKey:key];
if (entry != nil) {
// cache hit
return entry;
}
}
// , 。
UIImage *contents = [self createContentsForkey:key isCancelled:isCancelled];
if (contents == nil) { // If nil, we were cancelled
return nil;
}
{
ASDN::MutexLocker l(cacheLock);
return [cache setObject:contents forKey:key];
}
}
EntryオブジェクトはすべてASWeakMapに存在します.
ここにキャッシュがない場合は、createContentsForkeyメソッドを直接呼び出して作成します.作成プロセスは、現在のピクチャを復号し、imageModificationBlockの呼び出しを復号したことにほかならない.ここでblockを使うのは、他に効果があるかもしれないからです.
ASWeakMap
の声明は以下の通りである.@interface ASWeakMap<__covariant key="" :="" nsobject="" value=""> : NSObject
/**
* Read from the cache. The Value object is accessible from the returned ASWeakMapEntry.
*/
- (nullable ASWeakMapEntry *)entryForKey:(Key)key;
/**
* Put a value into the cache. If an entry with an equal key already exists, then the value is updated on the existing entry.
*/
- (ASWeakMapEntry *)setObject:(Value)value forKey:(Key)key;
@end
画像のフィレットがパフォーマンスに影響を与える場合は、ここを参照してください.ASWeakMapはAsyncDisplayKitから直接取り出すことができ、何の依存もありません.