123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- /*
- * This file is part of the SDWebImage package.
- * (c) Olivier Poitrey <rs@dailymotion.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- #import "UIButton+WebCache.h"
- #if SD_UIKIT
- #import "objc/runtime.h"
- #import "UIView+WebCacheOperation.h"
- #import "UIView+WebCache.h"
- static char imageURLStorageKey;
- typedef NSMutableDictionary<NSString *, NSURL *> SDStateImageURLDictionary;
- static inline NSString * imageURLKeyForState(UIControlState state) {
- return [NSString stringWithFormat:@"image_%lu", (unsigned long)state];
- }
- static inline NSString * backgroundImageURLKeyForState(UIControlState state) {
- return [NSString stringWithFormat:@"backgroundImage_%lu", (unsigned long)state];
- }
- static inline NSString * imageOperationKeyForState(UIControlState state) {
- return [NSString stringWithFormat:@"UIButtonImageOperation%lu", (unsigned long)state];
- }
- static inline NSString * backgroundImageOperationKeyForState(UIControlState state) {
- return [NSString stringWithFormat:@"UIButtonBackgroundImageOperation%lu", (unsigned long)state];
- }
- @implementation UIButton (WebCache)
- #pragma mark - Image
- - (nullable NSURL *)sd_currentImageURL {
- NSURL *url = self.sd_imageURLStorage[imageURLKeyForState(self.state)];
- if (!url) {
- url = self.sd_imageURLStorage[imageURLKeyForState(UIControlStateNormal)];
- }
- return url;
- }
- - (nullable NSURL *)sd_imageURLForState:(UIControlState)state {
- return self.sd_imageURLStorage[imageURLKeyForState(state)];
- }
- - (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state {
- [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil];
- }
- - (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder {
- [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil];
- }
- - (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options {
- [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil];
- }
- - (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state completed:(nullable SDExternalCompletionBlock)completedBlock {
- [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:completedBlock];
- }
- - (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock {
- [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:completedBlock];
- }
- - (void)sd_setImageWithURL:(nullable NSURL *)url
- forState:(UIControlState)state
- placeholderImage:(nullable UIImage *)placeholder
- options:(SDWebImageOptions)options
- completed:(nullable SDExternalCompletionBlock)completedBlock {
- if (!url) {
- [self.sd_imageURLStorage removeObjectForKey:imageURLKeyForState(state)];
- } else {
- self.sd_imageURLStorage[imageURLKeyForState(state)] = url;
- }
-
- __weak typeof(self)weakSelf = self;
- [self sd_internalSetImageWithURL:url
- placeholderImage:placeholder
- options:options
- operationKey:imageOperationKeyForState(state)
- setImageBlock:^(UIImage *image, NSData *imageData) {
- [weakSelf setImage:image forState:state];
- }
- progress:nil
- completed:completedBlock];
- }
- #pragma mark - Background Image
- - (nullable NSURL *)sd_currentBackgroundImageURL {
- NSURL *url = self.sd_imageURLStorage[backgroundImageURLKeyForState(self.state)];
-
- if (!url) {
- url = self.sd_imageURLStorage[backgroundImageURLKeyForState(UIControlStateNormal)];
- }
-
- return url;
- }
- - (nullable NSURL *)sd_backgroundImageURLForState:(UIControlState)state {
- return self.sd_imageURLStorage[backgroundImageURLKeyForState(state)];
- }
- - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state {
- [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil];
- }
- - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder {
- [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil];
- }
- - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options {
- [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil];
- }
- - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state completed:(nullable SDExternalCompletionBlock)completedBlock {
- [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:completedBlock];
- }
- - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock {
- [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:completedBlock];
- }
- - (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url
- forState:(UIControlState)state
- placeholderImage:(nullable UIImage *)placeholder
- options:(SDWebImageOptions)options
- completed:(nullable SDExternalCompletionBlock)completedBlock {
- if (!url) {
- [self.sd_imageURLStorage removeObjectForKey:backgroundImageURLKeyForState(state)];
- } else {
- self.sd_imageURLStorage[backgroundImageURLKeyForState(state)] = url;
- }
-
- __weak typeof(self)weakSelf = self;
- [self sd_internalSetImageWithURL:url
- placeholderImage:placeholder
- options:options
- operationKey:backgroundImageOperationKeyForState(state)
- setImageBlock:^(UIImage *image, NSData *imageData) {
- [weakSelf setBackgroundImage:image forState:state];
- }
- progress:nil
- completed:completedBlock];
- }
- #pragma mark - Cancel
- - (void)sd_cancelImageLoadForState:(UIControlState)state {
- [self sd_cancelImageLoadOperationWithKey:imageOperationKeyForState(state)];
- }
- - (void)sd_cancelBackgroundImageLoadForState:(UIControlState)state {
- [self sd_cancelImageLoadOperationWithKey:backgroundImageOperationKeyForState(state)];
- }
- #pragma mark - Private
- - (SDStateImageURLDictionary *)sd_imageURLStorage {
- SDStateImageURLDictionary *storage = objc_getAssociatedObject(self, &imageURLStorageKey);
- if (!storage) {
- storage = [NSMutableDictionary dictionary];
- objc_setAssociatedObject(self, &imageURLStorageKey, storage, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }
- return storage;
- }
- @end
- #endif
|