22 Stimmen

Was ist der beste Weg, die Farbe/die Ansicht des Offenlegungspfeil-Accessoire-Ansicht in einer Tabellenansichtszelle in iOS zu ändern?

Ich muss die Farbe des disclosureIndicatorView-Zubehörs in einer UITableViewCell ändern. Ich denke, es gibt zwei Möglichkeiten, um dies zu erreichen, aber ich kann nicht herausfinden, welche optimal ist. Hier ist also, was ich tun kann.

Es gibt eine Eigenschaft von UITableViewCell - accessoryView. Also kann ich setAccessoryView:(UIView *)view verwenden und view als das UIImageView übergeben, das das gewünschte Bild enthält.

Ich habe eine Hilfsklasse geschrieben, die die Inhaltsansicht (Dinge wie Hintergrundfarbe, Hinzufügen anderer Dinge usw.) für meine Zelle erstellt, und ich füge diese Inhaltsansicht der Zelle in UITableViewDelegate hinzu. Die andere Option besteht darin, ein UIImage zu zeichnen, indem die drawRect-Methode der Hilfsklasse CustomContentView überschrieben wird.

Bei Option 1 - kann ich die Dinge auf die Art und Weise von Apple erledigen. Einfach die Ansicht geben und sie erledigen den Rest. Aber ich vermute, dass das Hinzufügen eines neuen UIView-Objekts zu jeder Zeile sich als eine schwere Objektzuweisung erweisen könnte und die Bildrate verringert. Im Vergleich zu nur einem UIImage-Objekt in meiner contentView. Ich glaube, UIImage ist leichter als UIView.

Bitte werft etwas Licht darauf, Leute, und helft mir, mich zu entscheiden.

0 Stimmen

Sicherlich wünscht man sich, dass man das UIImageView einfach auf alle Zeilen teilen könnte.

0 Stimmen

Siehe eine Bibliothek. Ändern Sie ganz einfach die Farben aller Arten von accessoryType. MSCellAccessoryView

0 Stimmen

Alte Frage, aber bisher noch keine zufriedenstellende Antwort erhalten. Hier ist, was Sie wirklich gefragt haben: stackoverflow.com/a/35427599/378024

29voto

Nate Potter Punkte 3190

Toller Beitrag auf Cocoanetics, der dies anspricht. Die UIControl-Klasse erbt die Eigenschaften selected, enabled und highlighted Benutzerdefinierte farbige Offenlegungsindikatoren

24voto

benzado Punkte 78100

Wenn Sie daran interessiert sind, den Indikator zu zeichnen, anstelle einer Bilddatei zu verwenden, hier ist der Code, den ich dafür entwickelt habe:

// (x,y) ist die Spitze des Pfeils
CGFloat x = CGRectGetMaxX(self.bounds) - RIGHT_MARGIN;
CGFloat y = CGRectGetMidY(self.bounds);
const CGFloat R = 4.5;
CGContextRef ctxt = UIGraphicsGetCurrentContext();
CGContextMoveToPoint(ctxt, x-R, y-R);
CGContextAddLineToPoint(ctxt, x, y);
CGContextAddLineToPoint(ctxt, x-R, y+R);
CGContextSetLineCap(ctxt, kCGLineCapSquare);
CGContextSetLineJoin(ctxt, kCGLineJoinMiter);
CGContextSetLineWidth(ctxt, 3);
// Wenn die Zelle hervorgehoben ist (blaues Hintergrund), in Weiß zeichnen; sonst grau
if (CONTROL_IS_HIGHLIGHTED) {
    CGContextSetRGBStrokeColor(ctxt, 1, 1, 1, 1);
} else {
    CGContextSetRGBStrokeColor(ctxt, 0.5, 0.5, 0.5, 1);
}
CGContextStrokePath(ctxt);

Wenn Sie eine benutzerdefinierte UIView-Unterklasse erstellen, tun Sie oben genanntes im drawRect: Methode und verwenden Sie das als Ihren Zusatzansicht, können Sie die Farbe nach Belieben ändern.

Eine Zusatzansicht (benutzerdefiniert oder UIImageView) wird kein größeres Leistungsproblem sein, solange Sie UITableViewCell-Instanzen ordnungsgemäß wiederverwerten.

0 Stimmen

Können Sie mir sagen, wie CONTROL_IS_HIGHLIGHTED gesetzt wird? Ich meine, wie weiß die Zelle, dass sie hervorgehoben ist?

0 Stimmen

Wenn Sie in einer Tabellenansichtszelle zeichnen, bin ich ziemlich sicher, dass UITableViewCell eine highlighted Eigenschaft hat.

0 Stimmen

Ich habe versucht, diesen Code zu verwenden, aber aus irgendeinem Grund verliere ich den scharfen Punkt, an dem sich die beiden Linien schneiden, und bekomme einen gedämpften Winkel. Irgendwelche Ideen?

12voto

gblazex Punkte 47453

Hier ist eine Implementierung, die in iOS 8+ funktioniert. Es macht genau das, was gefragt ist:
Ändern Sie die Farbe des ursprünglichen Apple-Disclosure-Indikators in eine benutzerdefinierte Farbe.
Verwenden Sie es so:

#import "UITableViewCell+DisclosureIndicatorColor.h"
// Zelle ist eine UITableViewCell
Zelle.disclosureIndicatorColor = [UIColor redColor]; // benutzerdefinierte Farbe
[Zelle updateDisclosureIndicatorColorToTintColor]; // oder verwenden Sie die globale Farbe

UITableViewCell+DisclosureIndicatorColor.h

@interface UITableViewCell (DisclosureIndicatorColor)
@property (nonatomic, strong) UIColor *disclosureIndicatorColor;
- (void)updateDisclosureIndicatorColorToTintColor;
@end

UITableViewCell+DisclosureIndicatorColor.m

@implementation UITableViewCell (DisclosureIndicatorColor)

- (void)updateDisclosureIndicatorColorToTintColor {
    [self setDisclosureIndicatorColor:self.window.tintColor];
}

- (void)setDisclosureIndicatorColor:(UIColor *)color {
    NSAssert(self.accessoryType == UITableViewCellAccessoryDisclosureIndicator,
        @"Zubehörtype muss UITableViewCellAccessoryDisclosureIndicator sein");

    UIButton *arrowButton = [self arrowButton];
    UIImage *image = [arrowButton backgroundImageForState:UIControlStateNormal];
    image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    arrowButton.tintColor = color;
    [arrowButton setBackgroundImage:image forState:UIControlStateNormal];
}

- (UIColor *)disclosureIndicatorColor {
    NSAssert(self.accessoryType == UITableViewCellAccessoryDisclosureIndicator, 
        @"Zubehörtype muss UITableViewCellAccessoryDisclosureIndicator sein");

    UIButton *arrowButton = [self arrowButton];
    return arrowButton.tintColor;
}

- (UIButton *)arrowButton {
    for (UIView *view in self.subviews)
        if ([view isKindOfClass:[UIButton class]])
            return (UIButton *)view;
    return nil;
}

@end

0 Stimmen

Rote Farbe wird blau

10voto

Stephen Orr Punkte 271

In Swift 3 habe ich die Lösung von @galambalazs als Klassenerweiterung wie folgt angepasst:

import UIKit

extension UITableViewCell {

    func setDisclosure(toColour: UIColor) -> () {
        for view in self.subviews {
            if let disclosure = view as? UIButton {
                if let image = disclosure.backgroundImage(for: .normal) {
                    let colouredImage = image.withRenderingMode(.alwaysTemplate);
                    disclosure.setImage(colouredImage, for: .normal)
                    disclosure.tintColor = toColour
                }
            }
        }
    }
}

Ich hoffe, das hilft einigen.

0 Stimmen

Funktioniert gut für mich, ich rufe diese Methode in der Delegatenfunktion willDisplayCell:forRowAtIndexPath auf.

5voto

charliehorse55 Punkte 1858

Verwenden Sie ein UIImageView. Dies ermöglicht es Ihnen auch, das Bild zu ändern, wenn die Zelle ausgewählt ist:

UIImageView* arrowView = [[UIImageView alloc] initWithImage:normalImage];
arrowView.highlightedImage = selectedImage;
cell.accessoryView = arrowView;
[arrowView release];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X