いつもとちょっと違うところにアクセサリーを置きたい。出来ますか?このコードは効果がありません:
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.accessoryView.frame = CGRectMake(5.0, 5.0, 5.0, 5.0);
いつもとちょっと違うところにアクセサリーを置きたい。出来ますか?このコードは効果がありません:
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.accessoryView.frame = CGRectMake(5.0, 5.0, 5.0, 5.0);
いいえ、アクセサリ ビューがある場所に移動することはできません。別の方法として、次のようなサブビューを追加できます。
[cell.contentView addSubview:aView];
また、accessoryView
プロパティを何かに等しく設定することにより、accessoryType
値は無視されます。
デフォルトのaccessoryViewを移動する方法はありますが、かなりハッキーです。そのため、新しいSDKが到着すると、ある日機能しなくなる可能性があります。
自己責任で使用してください(このコードスニペットは任意のaccessoryView
8ピクセルを左に移動します。目的のサブクラス[self positionAccessoryView];
のメソッド内から呼び出します):-(void)layoutSubviews
UITableViewCell
- (void)layoutSubviews {
[super layoutSubviews];
[self positionAccessoryView];
}
- (void)positionAccessoryView {
UIView *accessory = nil;
if (self.accessoryView) {
accessory = self.accessoryView;
} else if (self.accessoryType != UITableViewCellAccessoryNone) {
for (UIView *subview in self.subviews) {
if (subview != self.textLabel &&
subview != self.detailTextLabel &&
subview != self.backgroundView &&
subview != self.contentView &&
subview != self.selectedBackgroundView &&
subview != self.imageView &&
[subview isKindOfClass:[UIButton class]]) {
accessory = subview;
break;
}
}
}
CGRect r = accessory.frame;
r.origin.x -= 8;
accessory.frame = r;
}
カスタム セル サブクラスでこれを行うだけで、アクセサリ ビューのフレームを変更できました。
CGRect adjustedFrame = self.accessoryView.frame;
adjustedFrame.origin.x += 10.0f;
self.accessoryView.frame = adjustedFrame;
これを行う別の方法は、セルのアクセサリ ビューとして設定された別のビューにカスタム アクセサリ ビューを埋め込み、フレームを使用してパディングを制御することです。
カスタム アクセサリ ビューとしてイメージ ビューを使用した例を次に示します。
// Use insets to define the padding on each side within the wrapper view
UIEdgeInsets insets = UIEdgeInsetsMake(24, 0, 0, 0);
// Create custom accessory view, in this case an image view
UIImage *customImage = [UIImage imageNamed:@"customImage.png"];
UIImageView *accessoryView = [[UIImageView alloc] initWithImage:customImage];
// Create wrapper view with size that takes the insets into account
UIView *accessoryWrapperView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, customImage.size.width+insets.left+insets.right, customImage.size.height+insets.top+insets.bottom)];
// Add custom accessory view into wrapper view
[accessoryWrapperView addSubview:accessoryView];
// Use inset's left and top values to position the custom accessory view inside the wrapper view
accessoryView.frame = CGRectMake(insets.left, insets.top, customImage.size.width, customImage.size.height);
// Set accessory view of cell (in this case this code is called from within the cell)
self.accessoryView = accessoryWrapperView;
上記の回答は、ios 6.1 ではうまくいきませんでした。DetailDisclosure は UIButton であるため、UIEdgeInsets を使用しようとしました。そして、それは今うまくいきます。ここにソース:
if (cell.accessoryType == UITableViewCellAccessoryDetailDisclosureButton) {
UIView* defaultAccessoryView = [cell.subviews lastObject];
if ([defaultAccessoryView isKindOfClass:[UIButton class]]){
UIButton *bt = (UIButton*)defaultAccessoryView;
bt.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 10);
}
}
多分これで十分でしょう:
UIImageView* accessoryImageView = [[UIImageView alloc] initWithFrame:
CGRectMake(0, 0, accessoryImage.size.width + MARGIN_RIGHT, accessoryImage.size.height)];
accessoryImageView.contentMode = UIViewContentModeLeft;
accessoryImageView.image = accessoryImage;
self.accessoryView = accessoryImageView;
このように右側にパディングを追加したので、アクセサリ ボタンが左側にずれて見えます。唯一の副作用は、タッチに反応する領域が広いことです。
私はios5で作業していましたが、Alexeyが提供したソリューションは完全には機能していませんでした. 私は、accessoryType がテーブルに設定されている場合、accessoryView が null であるため、最初の「if」が機能していないことを発見しました。コードを少し変更しました。
if (self.accessoryType != UITableViewCellAccessoryNone) {
UIView* defaultAccessoryView = nil;
for (UIView* subview in self.subviews) {
if (subview != self.textLabel &&
subview != self.detailTextLabel &&
subview != self.backgroundView &&
subview != self.contentView &&
subview != self.selectedBackgroundView &&
subview != self.imageView &&
subview != self.explanationButton && // Own button
subview.frame.origin.x > 0 // Assumption: the checkmark will always have an x position over 0.
) {
defaultAccessoryView = subview;
break;
}
}
r = defaultAccessoryView.frame;
r.origin.x -= 8;
defaultAccessoryView.frame = r;
}
このソリューションは私のために働いています。Alexey が言ったように、将来のバージョンで何が起こるかはわかりませんが、少なくとも iOS 4 では動作しています。