it-swarm.com.ru

Как программно изменить цвет индикатора раскрытия UITableView?

Я знаю, что с помощью UIImageView Мы можем установить аксессуар индикатора раскрытия, но я хочу изменить только цвет индикатора раскрытия без использования UIImageView.

Это возможно или нет? Если это возможно, то как? 

24
Bhavesh

Добавьте свой собственный индикатор раскрытия:

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

Я знаю, что опоздал на вечеринку, но я только что подготовил собственный вид, который рисует вид раскрытия. Я быстро сделал это для демонстрации, поэтому она может быть не очень точной, она просто выполняет свою работу. Надеюсь, это поможет кому-то:

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

З.

4
Zoltán

Извините, я супер супер опоздал на вечеринку, но я боролся с этим сегодня и только разобрался (в iOS8 и 9). Используя отладчик представления, было ясно, что треугольник раскрытия - это UIImage в UIImageView в UIButton.

Так что в -awakeFromNib я перебирал подпредставления, чтобы найти кнопку. Как только я нашел кнопку, ссылку на исходное изображение можно было получить через -backgroundImageForState:

Получив исходное изображение, вы можете создать копию, которая является изображением шаблона, вызвав [originalImage imageWithRenderingMode: AlwaysTemplate]

Затем вы можете установить backgroundImage для всех доступных состояний. Как только вы это сделаете, изображение автоматически подберет оттенок цвета. 

Ниже приведен пример кода Swift:

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

Как указывалось выше, один из способов изменить 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
1
Gooshan

Вы должны создать свой собственный пользовательский UIButton и установить его как ячейки accessoryView. Вы не можете изменить его цвет, просто указав его UIColor.

Вы можете настроить Индикатор раскрытия, добавив одно изображение для нормального состояния и другое для выбранного (выделено).

одна библиотека для настройки индикатора раскрытия информации: отметьте здесь .

1
Mumthezir VP

Вы можете попробовать с помощью 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];
0
TechFanatic