web-dev-qa-db-de.com

Wie kann die Farbe des Offenlegungsindikators von UITableView programmatisch geändert werden?

Ich weiß, dass mit UIImageView das Disclosure Indicator-Zubehör festgelegt werden kann. Ich möchte jedoch nur die Offenlegungsindikatorfarbe ändern, ohne UIImageView zu verwenden.

Ist es möglich oder nicht? Wenn es möglich ist, wie? 

24
Bhavesh

Fügen Sie Ihren eigenen Offenlegungsindikator hinzu:

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

Ich weiß, dass ich zu spät zur Party komme, aber ich habe gerade eine benutzerdefinierte Ansicht vorbereitet, die eine Offenlegungsansicht zeichnet. Ich habe es schnell für eine Demo erstellt, daher ist es vielleicht nicht besonders präzise, ​​es erledigt einfach die Arbeit. Hoffe es hilft jemandem:

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

Dann mache ich in meiner eigenen Zelle Folgendes:

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

Theoretisch sollte es auch möglich sein, die Farbe nach der Initialisierung zu ändern.

Sieht aus wie das:Sample usage of the view

Z.

4
Zoltán

Sorry, ich bin super super spät auf der Party, aber ich hatte heute Probleme damit und habe es gerade herausgefunden (in iOS8 und 9). Bei Verwendung des View Debugger war klar, dass das Disclosure-Dreieck eine UIImage in einer UIImageView in einem UIButton ist.

In -awakeFromNib durchforstete ich die Unteransichten, um eine Schaltfläche zu finden. Nachdem ich die Schaltfläche gefunden hatte, konnte ein Verweis auf das Originalbild über -backgroundImageForState abgerufen werden:

Sobald Sie das Originalbild erhalten haben, können Sie eine Kopie erstellen, die ein Vorlagenbild ist, indem Sie [originalImage imageWithRenderingMode: AlwaysTemplate] aufrufen.

Dann können Sie das backgroundImage für alle verfügbaren Status festlegen. Sobald Sie dies getan haben, nimmt das Bild automatisch die Tönungsfarbe auf. 

Nachfolgend finden Sie einige Swift-Beispielcodes:

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
Jeffrey Bergier

Wie oben erwähnt, besteht eine Möglichkeit zum Ändern einer Zubehöransicht darin, Ihre eigene UIImageView hinzuzufügen. Sie können jedoch jedes Objekt angeben, das von UIView stammt. Ich würde dann empfehlen, anstelle von UIImageView ein UILabel mit einer Symbolschriftart (z. B. icomoon) zu verwenden. UILabel und eine Icon-Schriftart ermöglichen Flexibilität in Bild, Farbe und Größe. 

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
1
Gooshan

Sie müssen Ihren eigenen benutzerdefinierten UIButton erstellen und als .__ der Zelle festlegen. Zubehöransicht. Sie können die Farbe nicht ändern, indem Sie einfach dessen .__ angeben. UIColor.

Sie können den Disclosure Indicator anpassen, indem Sie ein Bild für den Normalzustand und ein anderes für das ausgewählte (hervorgehobene) hinzufügen.

eine Bibliothek zum Anpassen des Offenlegungsindikators: hier prüfen .

1
Mumthezir VP

Sie können mit uiimageview versuchen, cell AccessoryType wie im folgenden Code anzuwenden:

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];
0
TechFanatic