我有一个 UIButton 在某些情况下应该显示活动指示器而不是图像。我现在所做的是将按钮的 imageView 的隐藏属性设置为 YES 并返回。我还尝试将 alpha 值设置为 0.0f 并返回到 1.0f。
这一直有效,直到按钮的状态发生变化。这会重置 imageView 的属性并导致 hidden == NO 和 alpha == 1.0f。
有没有人做过类似的事情或知道如何隐藏按钮的 imageView 而其余部分保持可见?
您可以通过使用视图层的变换属性来实现这一点,即
SWIFT代码
button.imageView?.layer.transform = CATransform3DMakeScale(0.0, 0.0, 0.0)
Objective-C 代码
button.imageView.layer.transform = CATransform3DMakeScale(0, 0, 0);
button.imageView?.layer.transform = CATransform3DIdentity
Objective-C 代码
button.imageView.layer.transform = CATransform3DIdentity
很简单。按钮有不同的状态。只需为选定状态设置零图像,为正常状态设置图像。当您想要显示活动指示器时,将按钮状态设置为选中并将指示器添加为按钮子视图。
- (void)initializeButton {
button = [[UIButton alloc] init];
[button addTarget:self action:@selector(buttonDidClick:) forControlEvents:UIControlEventTouchUpInside];
[button setImage:[[UIImage alloc] init] forState:UIControlStateSelected]; //zero image
[button setImage:yourImage forState:UIControlStateSelected]; //your image
}
- (void)buttonDidClick:(UIButton *)button {
button.selected = YES;
/* Add yor activity indicator with some view tag or save reference to it */
}
活动完成后调用 next 方法
- (void)finishActivityWithButton:(UIButton *)button {
button.selected = NO;
/* Remove your activity indicator from button */
}
如果您使用的是模板图像,请将色调颜色设置为 [UIColor clearColor](可能也适用于其他人,没有尝试)
[[button imageView] setTintColor:[UIColor clearColor]];
您可以通过在要隐藏图像时从按钮中删除图像并在需要显示图像时将图像分配回按钮来实现此目的。
当您想隐藏图像时,可以这样写:
[yourButton setImage:nil forState:UIControlStateNormal];
并且当您想要显示图像时:
[yourButton setImage:yourImage forState:UIControlStateNormal];
这yourButton
是您的UIButton
,并且yourImage
是UIImage
保存按钮图像的。
更改转换或选择状态会导致另一个问题,最好的方法是使用类别:
const char kNormalImage;
const char kSelectImage;
const char kDisableImage;
@interface UIButton ()
@property (nonatomic, strong) UIImage *normalImage;
@property (nonatomic, strong) UIImage *selectImage;
@property (nonatomic, strong) UIImage *disableImage;
@end
@implementation UIButton (Hidden)
- (void)setImageViewHidden:(BOOL)hidden {
if (hidden) {
self.normalImage = [self imageForState:UIControlStateNormal];
self.selectImage = [self imageForState:UIControlStateSelected];
self.disableImage = [self imageForState:UIControlStateDisabled];
UIGraphicsBeginImageContextWithOptions(self.imageView.bounds.size, NO, 0.0);
UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self setImage:blank forState:UIControlStateNormal];
[self setImage:blank forState:UIControlStateSelected];
[self setImage:blank forState:UIControlStateDisabled];
} else {
[self setImage:self.normalImage forState:UIControlStateNormal];
[self setImage:self.selectImage forState:UIControlStateSelected];
[self setImage:self.disableImage forState:UIControlStateDisabled];
}
}
- (UIImage *)normalImage {
return objc_getAssociatedObject(self, &kNormalImage);
}
- (void)setNormalImage:(UIImage *)normalImage {
objc_setAssociatedObject(self, &kNormalImage, normalImage, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIImage *)selectImage {
return objc_getAssociatedObject(self, &kSelectImage);
}
- (void)setSelectImage:(UIImage *)selectImage {
objc_setAssociatedObject(self, &kSelectImage, selectImage, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIImage *)disableImage {
return objc_getAssociatedObject(self, &kDisableImage);
}
- (void)setDisableImage:(UIImage *)disableImage {
objc_setAssociatedObject(self, &kDisableImage, disableImage, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end