iOS:有没有办法获取视图中每个元素的背景颜色?

时间:2014-07-20 01:51:27

标签: ios objective-c recursion subclass objective-c-category

我目前正在尝试在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 backgroundColornil;

是否有更好的方法来访问和更改uiview上每个元素的颜色而不会在初始ViewController中使其变得复杂?我想为greyscale,darkerShade等做这个。

谢谢!

1 个答案:

答案 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];