Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

特殊情况:结合SDWebImage使用 #8

Closed
zhao0 opened this issue Jun 28, 2016 · 4 comments
Closed

特殊情况:结合SDWebImage使用 #8

zhao0 opened this issue Jun 28, 2016 · 4 comments

Comments

@zhao0
Copy link

zhao0 commented Jun 28, 2016

我在实际使用中遇到这种情况

[self.avatar sd_setBackgroundImageWithURL:[NSURL URLWithString:self.avatar]
                                     forState:UIControlStateNormal
                             placeholderImage:[UIImage imageWithName:@"img_avatar_user_default"]];

要求placeholderImage根据主题不同使用不同图片,不知道有什么合适的方法

@zhao0 zhao0 changed the title 特殊情况 特殊情况:结合SDWebImage使用 Jun 28, 2016
@wxxsw
Copy link
Owner

wxxsw commented Jun 28, 2016

首先得到当前主题应该设置的占位图片名:

  • 通过索引
// ThemeManager.currentThemeIndex 可以获得当前主题的索引
NSString *imageName = ThemeManager.currentThemeIndex == 0 ? @"first_image" : @"second_image";
  • 通过plist
// stringForKeyPath可以直接获得keyPath中的值
NSString *imageName = [ThemeManager stringForKeyPath:@"YourImageNameKeyPath"];

然后设置图片:

[self.avatar sd_setBackgroundImageWithURL:[NSURL URLWithString:self.avatar]
                                     forState:UIControlStateNormal
                             placeholderImage:[UIImage imageWithName:imageName]];

上面的方法有一个缺陷,当avatar正显示占位图时切换主题,此时占位图并不会随主题改变,如果这种情况比较明显,可以注册通知ThemeUpdateNotification,触发时重新调用一次上面的步骤设置avatar

@zhao0
Copy link
Author

zhao0 commented Jun 29, 2016

其实我是想让placeholderImage也用上ThemeImagePicker,后来想了一个不是很优雅的方法

- (void)theme_setBackgroundImageWithURL:(NSURL *)url
                            forState:(UIControlState)state
              placeholderImageName:(NSString *)imageKeyPath {
    [self theme_setBackgroundImage:[ThemeImagePicker pickerWithKeyPath:imageKeyPath] forState:state];
    NSString *imageName = [ThemeManager stringForKeyPath:imageKeyPath];
    @weakify(self);
    [self sd_setBackgroundImageWithURL:[self thumbnailImageURL:url]
                              forState:UIControlStateNormal
                      placeholderImage:[UIImage imageWithName:imageName]
                             completed:
                                 ^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                                     @strongify(self);
                                     if (!error) {
                                         NSMutableDictionary *dict = [self.themePickers mutableCopy];
                                         [dict setValue:nil forKey:@"setBackgroundImage:forState:"];
                                         self.themePickers = [dict copy];
                                     }
                                 }];
}

@wxxsw
Copy link
Owner

wxxsw commented Jun 29, 2016

这个方法看上去是可行的,可以改进的是:

NSString *imageName = [ThemeManager stringForKeyPath:imageKeyPath];
[UIImage imageWithName:imageName];
// 可以替换为:
[ThemeManager imageForKeyPath:imageKeyPath];
NSMutableDictionary *dict = [self.themePickers mutableCopy];
[dict setValue:nil forKey:@"setBackgroundImage:forState:"];
self.themePickers = [dict copy];
// 可以替换为:
[self theme_setBackgroundImage:nil forState:UIControlStateNormal]; // 现在类型不支持,我改一下

然后你可以这样写:

[self theme_setBackgroundImage:[ThemeImagePicker pickerWithKeyPath:imageKeyPath] forState:state];
@weakify(self);
[self sd_setBackgroundImageWithURL:[self thumbnailImageURL:url]
                          forState:state
                  placeholderImage:[ThemeManager imageForKeyPath:imageKeyPath]
                         completed:
                             ^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                                 @strongify(self);
                                 if (!error) {
                                     [self theme_setBackgroundImage:nil forState:UIControlStateNormal];
                                 }
                             }];

现在已经支持这样写(需要更新一下SwiftTheme,版本0.2.1):

[self theme_setBackgroundImage:nil forState:UIControlStateNormal];

@zhao0
Copy link
Author

zhao0 commented Jun 29, 2016

@zhao0 zhao0 closed this as completed Jun 29, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants