UITableViewで標準の公開アクセサリイメージのカスタムバージョンを使用したいと思います。これどうやってするの?この基本的なことには、UITableViewCellのサブクラス化が必要ないことを望んでいます。
カスタムビューを作成し、accessoryView
オブジェクトのUITableViewCell
プロパティに割り当てる必要があります。何かのようなもの:
myCell.accessoryView = [[ UIImageView alloc ]
initWithImage:[UIImage imageNamed:@"Something" ]];
- (UITableViewCell *)tableView:(UITableView *)tView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UIImage *indicatorImage = [UIImage imageNamed:@"Arrow.png"];
cell.accessoryView =[[[UIImageView alloc] initWithImage:indicatorImage] autorelease];
return cell;
}
さて、私は上記のヘルプコードでこれを行います
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 ] ;
Appleの素敵な例 があり、UIControl
を使用して、このようなアクセサリビューのカスタマイズを実現する方法を示しています。
UIControlで- (void)drawRect:(CGRect)rect
をオーバーライドするのは簡単な方法ではありませんが、素敵なアクセサリビューを柔軟にスタイル設定できます。
私は次のようにします:
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つのダウン投票があるからです!
これは私のために働いた:
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 }
}
}