web-dev-qa-db-ja.com

UITableViewCellでアクセサリの開示画像をカスタマイズするにはどうすればよいですか?

UITableViewで標準の公開アクセサリイメージのカスタムバージョンを使用したいと思います。これどうやってするの?この基本的なことには、UITableViewCellのサブクラス化が必要ないことを望んでいます。

50
jpm

カスタムビューを作成し、accessoryViewオブジェクトのUITableViewCellプロパティに割り当てる必要があります。何かのようなもの:

myCell.accessoryView = [[ UIImageView alloc ] 
                       initWithImage:[UIImage imageNamed:@"Something" ]];
121
codelogic
- (UITableViewCell *)tableView:(UITableView *)tView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    UIImage *indicatorImage = [UIImage imageNamed:@"Arrow.png"];
    cell.accessoryView =[[[UIImageView alloc]  initWithImage:indicatorImage] autorelease];


    return cell;
}

さて、私は上記のヘルプコードでこれを行います

9

Gregと同じ問題に遭遇しました-アクセサリビューが追跡しません(UIImageViewを使用している場合)

私はこのように解決しました:

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 ] ;
7
nielsbot

Appleの素敵な例 があり、UIControlを使用して、このようなアクセサリビューのカスタマイズを実現する方法を示しています。

UIControlで- (void)drawRect:(CGRect)rectをオーバーライドするのは簡単な方法ではありませんが、素敵なアクセサリビューを柔軟にスタイル設定できます。

enter image description here

1
H6.

私は次のようにします:

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;

投票する前にこれを試してください!現時点では、2つのアップ投票と2つのダウン投票があるからです!

0
Randika Vishman

Swift 4および5:

これは私のために働いた:

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...
}

何よりも、これにより tableView(_:accessoryButtonTappedForRowWith:) を使用してボタンアクションを処理できます。

私はこれをボタンに使用しましたが、同じ手法が開示イメージにも機能します。[/限り]タッチしたい要素の階層ツリーのそのブランチにクラスが1つしかないためです。


ああ、そうです、私のコードはこれを呼び出します:

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