如何以编程方式更改UITableView的披露指示颜色?

时间:2013-10-21 10:59:03

标签: ios iphone objective-c uitableview

我知道使用UIImageView我们可以设置Disclosure Indicator Accessory,但我想在不使用UIImageView的情况下仅更改披露指示器颜色。

可能与否?如果有可能那么如何?

6 个答案:

答案 0 :(得分:40)

添加您自己的披露指标:

cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"accessory.png"]];

答案 1 :(得分:4)

我知道我迟到了,但我刚刚准备了一个自定义视图来绘制一个披露视图。我很快就做了一个演示,所以它可能不是非常精确,它只是完成了工作。希望它可以帮助某人:

PZDisclosureIndicator.h

//
// Created by Pall Zoltan on 10/10/14.
// Copyright (c) 2014 pallzoltan. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface PZDisclosureIndicator : UIView
@property(nonatomic, strong) UIColor *color;

- (PZDisclosureIndicator *)initWithColor:(UIColor *)color;
@end

PZDisclosureIndicator.m:

//
// Created by Pall Zoltan on 10/10/14.
// Copyright (c) 2014 pallzoltan. All rights reserved.
//

#import "PZDisclosureIndicator.h"

@interface PZDisclosureIndicator ()

@property(nonatomic) CGFloat red;
@property(nonatomic) CGFloat green;
@property(nonatomic) CGFloat blue;
@property(nonatomic) CGFloat alpha;

@end

@implementation PZDisclosureIndicator

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBFillColor(context, self.red, self.green, self.blue, self.alpha);

    CGContextMoveToPoint(context, 4, 0);
    CGContextAddLineToPoint(context, 4, 0);
    CGContextAddLineToPoint(context, 16, 12);
    CGContextAddLineToPoint(context, 4, 24);
    CGContextAddLineToPoint(context, 0, 24 - 4);
    CGContextAddLineToPoint(context, 9, 12);
    CGContextAddLineToPoint(context, 0, 4);
    CGContextAddLineToPoint(context, 4, 0);
    CGContextFillPath(context);
}

- (PZDisclosureIndicator *)initWithColor:(UIColor *)color {
    self = [super initWithFrame:CGRectMake(0, 0, 16, 24)];
    self.backgroundColor = [UIColor clearColor];

    self.color = color;
    [self setNeedsDisplay];

    return self;
}

- (void)setColor:(UIColor *)color {
    _color = color;

    [self.color getRed:&_red green:&_green blue:&_blue alpha:&_alpha];

    [self setNeedsDisplay];
}

@end

然后在我的自定义单元格中,我这样做:

self.accessoryView = [[PZDisclosureIndicator alloc] initWithColor:SECONDARY_HIGHLIGHT_COLOR];

从理论上讲,你应该能够在初始化之后改变它的颜色,但是没有尝试过。

看起来像这样: Sample usage of the view

Ž。

答案 2 :(得分:3)

对不起,我在派对上已经超级晚了,但是今天我一直在努力解决这个问题,只是想出来(在iOS8和9中)。使用View Debugger,很明显Disclosure三角形是UIButton中UIImageView中的UIImage。

所以在-awakeFromNib中,我正在遍历子视图以找到一个按钮。找到按钮后,可以通过-backgroundImageForState:

获取对原始图像的引用

获得原始图像后,您可以通过调用[originalImage imageWithRenderingMode:AlwaysTemplate]

创建一个模板图像副本

然后,您可以为所有可用状态设置backgroundImage。完成后,Image会自动拾取色调颜色。

下面是一些快速的示例代码:

class GratuitousDisclosureTableViewCell: UITableViewCell {

    private weak var disclosureButton: UIButton? {
        didSet {
            if let originalImage = self.disclosureButton?.backgroundImageForState(.Normal) {
                let templateImage = originalImage.imageWithRenderingMode(.AlwaysTemplate)
                self.disclosureButton?.setBackgroundImage(templateImage, forState: .Normal)
                self.disclosureButton?.setBackgroundImage(templateImage, forState: .Highlighted)
                self.disclosureButton?.setBackgroundImage(templateImage, forState: .Disabled)
                self.disclosureButton?.setBackgroundImage(templateImage, forState: .Selected)
                self.disclosureButton?.setBackgroundImage(templateImage, forState: .Application)
                self.disclosureButton?.setBackgroundImage(templateImage, forState: .Reserved)
            }
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()

        for view in self.subviews {
            if let button = view as? UIButton {
                self.disclosureButton = button
                break
            }
        }  
    }
}

答案 3 :(得分:1)

  

您必须创建自己的自定义UIButton并将其设置为单元格   accessoryView的。你不能通过简单地指定它来改变它的颜色   的UIColor。

您可以通过为正常状态添加一个图像而为选定(突出显示)添加另一个图像来自定义Disclosure Indicator。

一个用于自定义披露指标的库:check here

答案 4 :(得分:1)

如上所述,修改accessoryView的一种方法是添加自己的UIImageView。但是,实际上您可以提供从UIView派生的任何对象。然后我建议使用带有图标字体的UILabel(例如icomoon)而不是UIImageView。 UILabel和图标字体允许图像,颜色和大小的灵活性。

let font = UIFont(name: "icomoon", size: 16.0)
let icon = "\u{e60f}"    
let lbl = UILabel(frame: CGRectMake(0, 0, 20, 20))
lbl.font = font
lbl.text = icon
cell.accessoryView = lbl

答案 5 :(得分:0)

您可以尝试使用uiimageview来应用cell accessoryType,如下面的代码:

cell.accessoryView = myAccessoryUIImageView;
cell accessoryview uiimageview not align correctly try below code:


UIView* accessoryView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 24, 50)];
UIImageView* accessoryViewImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"accessory_image.png"]];
accessoryViewImage.center = CGPointMake(12, 25);
[accessoryView addSubview:accessoryViewImage];
[cell setAccessoryView:accessoryView];