Hoe kan ik de accessoire-openbaarmakingsafbeelding in een UITableViewCell aanpassen?

Ik wil graag een aangepaste versie van de standaard afbeelding van een accessoire voor openbaarmaking in mijn UITableView gebruiken. Hoe kan ik dit doen? Ik hoop dat subclassificatie van UITableViewCell niet nodig is voor zoiets eenvoudigs.


Antwoord 1, autoriteit 100%

U moet een aangepaste weergave maken en deze toewijzen aan de eigenschap accessoryViewvan het object UITableViewCell. Iets als:

myCell.accessoryView = [[ UIImageView alloc ] 
                       initWithImage:[UIImage imageNamed:@"Something" ]];

Antwoord 2, autoriteit 8%

- (UITableViewCell *)tableView:(UITableView *)tView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIImage *indicatorImage = [UIImage imageNamed:@"Arrow.png"];
    cell.accessoryView =[[[UIImageView alloc]  initWithImage:indicatorImage] autorelease];
    return cell;
}

Nou, ik doe dit met de hierboven gegeven helpcode


Antwoord 3, autoriteit 6%

Ik kwam hetzelfde probleem tegen als Greg: de accessoireweergave volgt niet (als je een UIImageView gebruikt)

Ik heb het als volgt opgelost:

UIImage * image = [ UIImage imageNamed:@"disclosure-button-grey.png" ] ;
UIControl * c = [ [ UIControl alloc ] initWithFrame:(CGRect){ CGPointZero, image.size } ] ;
c.layer.contents = (id)image.CGImage ;
[ c addTarget:self action:@selector( accessoryTapped: ) forControlEvents:UIControlEventTouchUpInside ] ;
cell.accessoryView = c ;
[ c release ] ;

Antwoord 4

Er is een leuk voorbeeld van Applelaat zien hoe u UIControlkunt gebruiken om aan dit soort accessoires te voldoenBekijk maatwerk.

Het negeren van - (void)drawRect:(CGRect)rectin UIControl is niet de gemakkelijkste manier, maar geeft je veel flexibiliteit om mooie accessoireweergaven te stylen.

voer hier de afbeeldingsbeschrijving in


Antwoord 5

Ik zou het als volgt doen:

UIImageView *chevronImgVw = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"chevron_accessory_vw_img.png"]];
chevronImgVw.frame = CGRectMake(cell.accessoryView.frame.origin.x, cell.accessoryView.frame.origin.y, 10, 20);
cell.accessoryView = chevronImgVw;

Alsjeblieft, probeer dit voordat je gaat stemmen! Omdat het momenteel 2 upvotes en 2 downvotes heeft!


Antwoord 6

Swift 4 & 5:

Dit werkte voor mij:

class MyCell: UITableViewCell {
// boilerplate...
    fileprivate func commonInit() {
        // This is the button we want, just need to change the image.
        accessoryType = .detailButton
    }
    open override func layoutSubviews() {
        super.layoutSubviews()
        // Grab the "detail" button to change its icon. Functionality is set in the delegate.
        if let submitButton = allSubviews.compactMap({ $0 as? UIButton }).first {
            submitButton.setImage(#imageLiteral(resourceName: "icons8-enter-1"), for: .normal)
        }
    }
   // everything else...
}

Het beste van alles is dat ik hierdoor tableView(_:accessoryButtonTappedForRowWith) kan gebruiken: )om de knopacties af te handelen.

Ik heb dit voor de knop gebruikt, maar dezelfde techniek werkt voor de onthullingsafbeelding, [sinds/zolang] er slechts één klasse is in die tak van de hiërarchiestructuur van het element dat u wilt aanraken.


O ja, mijn code noemt dit:

extension UIView {
    var allSubviews: [UIView] {
        return subviews.flatMap { [$0] + $0.allSubviews }
    }
}

Antwoord 7

In swift 4 & 5

myCell.accessoryView = UIImageView(image: UIImage(named: "Something"))

Antwoord 8

OPMERKING: Stel GEEN aangepaste cel in op tag:0. Die tag is gereserveerd voor de textLabel-weergave. Als u tags instelt in Xcode Storyboard, moet u tags voor aangepaste weergaven/labels instellen op 1 of hoger.

Let op het voorbeeld van Apple:

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath (NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
    UILabel *label;
    label = (UILabel *)[cell viewWithTag:1];
    label.text = [NSString stringWithFormat:@"%d", indexPath.row];
    label = (UILabel *)[cell viewWithTag:2];
    label.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];
    return cell;
}

Antwoord 9

Ik heb de bovenstaande code geprobeerd en het lijkt niet meer te werken, misschien vanwege de leeftijd van dit bericht, dus ik zal mijn zin weggooien die me de aangepaste accessoireweergave gaf.

[cell setAccessoryView:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrowBtn"]]];

Ik hoop dat iemand dit nuttig vindt.

Other episodes