我目前正在尝试在ViewController
中创建一个简单的方法调用,例如:
[self greyscale];
其中灰度是UIViewController
类别中的方法。我正在尝试做的是使用递归和块,我正在尝试收集ViewController
中的每个元素并获取它们的backgroundColor
属性,然后更改这些值,使其变为greyScale即{{ 1}}
我尝试了以下内容(目前仅针对uibuttons):
[UIColor colorWithWhite:(0.299*red + 0.587*green + 0.114*blue) alpha:alpha];
到目前为止设置背景颜色是有效的,但问题是我收到了该元素的当前backgroundColor所以我可以将它发送到另一个为我做“灰度”的方法,所以我可以做类似的事情:< / p>
- (void)runBlockOnAllSubviews:(SubviewBlock)block {
block(self.view);
for (UIViewController* viewController in [self.view subviews]) {
[viewController runBlockOnAllSubviews:block];
}
}
- (void)greyscale {
[self runBlockOnAllSubviews:^(UIView *view) {
if ([view isKindOfClass:[UIButton class]]) {
[(UIControl *)view setBackgroundColor:[UIColor redColor]];
[(UIButton *)view setTitleColor:[UIColor purpleColor] forState:UIControlStateNormal];
}
}];
当我尝试将其设置为白色时,因为[(UIControl *)view setBackgroundColor:[UIColor greyScaleWith:view.backgroundColor]];
为"view"'s backgroundColor
或nil
;
是否有更好的方法来访问和更改uiview上每个元素的颜色而不会在初始ViewController中使其变得复杂?我想为greyscale,darkerShade等做这个。
谢谢!
答案 0 :(得分:1)
目前还不清楚你要在代码中使用块做什么;我认为使用块来完成任务没有任何特别的优势。此外,您的第一个循环(for(自我视图子视图)中的(UIViewController * viewController))没有意义,因为没有视图控制器作为视图的子视图。您可以使用UIView上的类别中的简单递归方法更改所有颜色。我已经包含了一个typedef来定义不同类型的颜色转换。我的示例只是将颜色转换为浅灰色或灰色,因此您应该在convertColorForView中替换您想要的任何算法:conversionType:来实现您的目标。这是.h,
typedef NS_ENUM(NSInteger, RDColorConversionType) {
RDColorConversionTypeGrayScale = 0,
RDColorConversionTypeDarken,
};
@interface UIView (ColorConversions)
- (void)convertSubviewsBackgroundColor:(RDColorConversionType) type;
.m文件,
@implementation UIView (ColorConversions)
- (void)convertSubviewsBackgroundColor:(RDColorConversionType) type {
//[self grayScaleForView:self];
for (UIView *subview in self.subviews) {
[self convertColorForView:subview conversionType:type]; // delete this line, and uncomment the one above if you want the view that calls this method to have its background color changed too.
[subview convertSubviewsBackgroundColor:type];
}
}
-(void)convertColorForView:(UIView *) view conversionType:(RDColorConversionType) type {
switch (type) {
case RDColorConversionTypeGrayScale:
view.backgroundColor = [UIColor lightGrayColor];
break;
case RDColorConversionTypeDarken:
view.backgroundColor = [UIColor grayColor];
break;
}
}
您可以在视图控制器中调用此方法,如此,
[self.view convertSubviewsBackgroundColor:RDColorConversionTypeGrayScale];