Welches ist der beste Weg, um die Farbe / Ansicht Offenlegung Indikator Zubehör Ansicht in einer Tabellenansicht Zelle in iOS zu ändern?

StackOverflow https://stackoverflow.com/questions/1852672

Frage

Ich brauche die Farbe des disclosureIndicatorView Zubehörteils in einem UITableViewCell zu ändern. Ich denke, es gibt zwei Möglichkeiten, dies zu tun bekommen, aber ich bin, um herauszufinden, nicht in der Lage, die man das Optimum ist. Also hier ist das, was ich denke, was ich tun kann.

Es ist eine Eigenschaft von UITableViewCell - accessoryView. So kann ich setAccessoryView:(UIView *)view verwenden und die Bildhalte Ansicht als UIImageView übergeben, die ich will.

Ich habe eine Utility-Klasse geschrieben, die den Inhalt Ansicht erstellt (Sachen wie Hintergrundfarbe, andere Sachen hinzufügen, usw.) für meine Zelle und ich füge hinzu, um die Zelle in UITableViewDelegate diesen Inhalt zu sehen. Die andere Option ist ein UIImage Überschreiben der drawRect Methode der CustomContentView Utility-Klasse zu ziehen.

Darstellende Option 1 - Ich kann die Dinge, die Apfel Art und Weise erledigen. Gib ihnen die Aussicht und sie machen den Rest. Aber ich denke, ein neues UIView Objekt zu jeder Zeile hinzugefügt könnte sich als ein schweres Objekt Zuordnung zu sein und die Framerate zu verringern. Im Vergleich zu nur ein UIImage Objekt in meinem contentView. Ich glaube, UIImage ist leichter als UIView.

Bitte werfen etwas Licht Menschen und mir helfen, darüber zu entscheiden.

War es hilfreich?

Lösung

  

Aber ich denke, das Hinzufügen ein neues UIView-Objekt zu jeder Zeile eine schwere obj Zuordnung erweisen könnte und die Framerate zu verringern. Im Vergleich zu nur ein UIImage-Objekt in meinem content. Ich glaube, UIImage ist leichter als UIView.

Zeichnung direkt ein Bild wird mit ziemlicher Sicherheit haben eine bessere Leistung als ein Subview hinzufügen. Sie müssen bestimmen, ob diese zusätzliche Leistung erforderlich ist. Ich habe ein paar Zubehör Ansichten für individuelle Offenlegung Indikatoren auf Basiszellen und die Leistung war in Ordnung verwendet. wenn Sie bereits jedoch speziell für den Inhalt rect Zeichnung tun, ist es vielleicht nicht so schwierig sein, auch das Zubehör Ansicht zu tun.

Andere Tipps

Große Post auf Cocoanetics, die diese Adressen. Die UIControl Klasse erbt die Eigenschaften ausgewählt, aktiviert und hervorgehoben Benutzerdefinierte Gefärbte Disclosure Indicators

Wenn Sie bei der Erstellung des Indikators interessiert sind, anstatt eine Bilddatei zu verwenden, hier ist Code, den ich so tun gearbeitet:

// (x,y) is the tip of the arrow
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);
// If the cell is highlighted (blue background) draw in white; otherwise gray
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 zu machen, gehen Sie wie oben in der drawRect. Methode und verwenden, die als Zubehörteil Ansicht, werden Sie in der Lage sein, die Farbe, was Sie wollen machen

Ein Zubehöransicht (benutzerdefinierte oder UIImageView kein großes Performance-Problem sein, solange Sie richtig UITableViewCell Instanzen sind Recycling.

Hier ist eine Implementierung, die in iOS 8+ funktioniert. Es ist genau das, was gefragt:
ändert die Farbe des ursprünglichen Apple-Offenlegung Indikatoren auf eine benutzerdefinierte Farbe.
 Verwenden Sie es wie folgt aus:

#import "UITableViewCell+DisclosureIndicatorColor.h"
// cell is a UITableViewCell
cell.disclosureIndicatorColor = [UIColor redColor]; // custom color
[cell updateDisclosureIndicatorColorToTintColor]; // or use global tint color

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,
        @"accessory type needs to be UITableViewCellAccessoryDisclosureIndicator");

    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, 
        @"accessory type needs to be UITableViewCellAccessoryDisclosureIndicator");

    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

In schnellen 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
                }
            }
        }
    }
}

Hope, das hilft einige.

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

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

benzado-Lösung funktioniert gut, aber es zeigte einen schwarzen Hintergrund. In der UIView Klasse, die Sie Setup (derjenige, die drawRect Funktion, die Sie in dem Code zu setzen ist) die folgende Initwithframe Implementierung, um die Offenlegung haben muss zeichnet einen transparenten Hintergrund haben:

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        [self setBackgroundColor:[UIColor clearColor]];
        // Initialization code.
    }
    return self;
}

Natürlich können Sie diese auf, was Farbe Sie wollen ...

Während galambalazs' Antwort funktioniert, sollte darauf hingewiesen werden, dass es so etwas wie ein Hack ist, da sie indirekt zugreift und Updates von Apple privaten Implementierung der Offenbarung Indikator. Bestenfalls könnte es stoppen in Zukunft iOS Versionen arbeitet, und im schlimmsten Fall führen zu App Store Ablehnung. die accessoryView Einstellung ist immer noch die bewährte Methode, bis Apple eine Eigenschaft zum direkten Einstellen der Farbe aussetzt.

Egal, hier ist die Swift Umsetzung seiner Antwort für diejenigen, die es wünschen können:

Hinweis: cell.disclosureIndicatorColor hat auf nach cell.accessoryType = .DisclosureIndicator so eingestellt, dass die disclosureIndicator Schaltfläche in der Zelle Subviews verfügbar:

extension UITableViewCell {

    public var disclosureIndicatorColor: UIColor? {
        get {
            return arrowButton?.tintColor
        }
        set {
            var image = arrowButton?.backgroundImageForState(.Normal)
            image = image?.imageWithRenderingMode(.AlwaysTemplate)
            arrowButton?.tintColor = newValue
            arrowButton?.setBackgroundImage(image, forState: .Normal)
        }
    }

    public func updateDisclosureIndicatorColorToTintColor() {
        self.disclosureIndicatorColor = self.window?.tintColor
    }

    private var arrowButton: UIButton? {
        var buttonView: UIButton?
        self.subviews.forEach { (view) in
            if view is UIButton {
                buttonView = view as? UIButton
                return
            }
        }
        return buttonView
    }
}

Ändern Sie den Farbton Farbe der Sichtzelle Tabelle. Überprüfen Sie den Screenshot gleich über Storyboard zu tun

Als Beitrag zur Lösung von @benzado ich swiftified seinen Code wie folgt:

override func drawRect(rect: CGRect) {

  super.drawRect(rect)

  let context = UIGraphicsGetCurrentContext();

  let right_margin : CGFloat = 15.0
  let length : CGFloat = 4.5;

  // (x,y) is the tip of the arrow
  let x = CGRectGetMaxX(self.bounds) - right_margin;
  let y = CGRectGetMidY(self.bounds);

  CGContextMoveToPoint(context, x - length, y - length);
  CGContextAddLineToPoint(context, x, y);
  CGContextAddLineToPoint(context, x - length, y + length);
  CGContextSetLineCap(context, .Round);
  CGContextSetLineJoin(context, .Miter);
  CGContextSetLineWidth(context, 2.5);

  if (self.highlighted)
  {
    CGContextSetStrokeColorWithColor(context, UIColor.appColorSelected().CGColor);
  }
  else
  {
    CGContextSetStrokeColorWithColor(context, UIColor.appColor().CGColor);
  }

  CGContextStrokePath(context);
}

Mit einer Änderung der App Farbe ein Aufruf an setNeedsDisplay () auf der UITableCellView die Farbe aktualisieren. Ich mag die Verwendung von UIImage Objekte in Zelle Ansichten zu vermeiden.

Eine schnelle 3-Version der CocoaNetics Lösung

public class DisclosureIndicator: UIControl {

    public static func create(color: UIColor?, highlightedColor: UIColor?) -> DisclosureIndicator{
        let indicator = DisclosureIndicator(frame: CGRect(x: 0, y: 0, width: 11, height: 15))
        if let color = color { indicator.color = color }
        if let color = highlightedColor { indicator.highlightedColor = color }
        return indicator
    }

    public var color: UIColor = .black
    public var highlightedColor: UIColor = .white

    override public init(frame: CGRect) {
        super.init(frame: frame)
        backgroundColor = .clear
    }

    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        backgroundColor = .clear
    }

    override public func draw(_ rect: CGRect) {
        super.draw(rect)

        let context = UIGraphicsGetCurrentContext()!;

        // (x,y) is the tip of the arrow
        let x = self.bounds.maxX - 3.0;
        let y = self.bounds.midY;

        let length : CGFloat = 4.5;
        context.move(to: CGPoint(x: x - length, y: y - length))
        context.addLine(to: CGPoint(x: x, y: y))
        context.addLine(to: CGPoint(x: x - length, y: y + length))
        context.setLineCap(.round)
        context.setLineJoin(.miter)
        context.setLineWidth(3)

        context.setStrokeColor((isHighlighted ? highlightedColor : color).cgColor)

        context.strokePath()
    }

    override public var isHighlighted: Bool {
        get {
            return super.isHighlighted
        }
        set {
            super.isHighlighted = newValue
            setNeedsDisplay()
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top