34

いつもとちょっと違うところにアクセサリーを置きたい。出来ますか?このコードは効果がありません:

cell.accessoryType =  UITableViewCellAccessoryDisclosureIndicator;
cell.accessoryView.frame = CGRectMake(5.0, 5.0, 5.0, 5.0);
4

11 に答える 11

30

いいえ、アクセサリ ビューがある場所に移動することはできません。別の方法として、次のようなサブビューを追加できます。

[cell.contentView addSubview:aView];

また、accessoryViewプロパティを何かに等しく設定することにより、accessoryType値は無視されます。

于 2010-05-20T17:27:39.217 に答える
23

デフォルトのaccessoryViewを移動する方法はありますが、かなりハッキーです。そのため、新しいSDKが到着すると、ある日機能しなくなる可能性があります。

自己責任で使用してください(このコードスニペットは任意のaccessoryView8ピクセルを左に移動します。目的のサブクラス[self positionAccessoryView];のメソッド内から呼び出します):-(void)layoutSubviewsUITableViewCell

- (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;
}
于 2011-05-27T08:46:32.850 に答える
16

カスタム セル サブクラスでこれを行うだけで、アクセサリ ビューのフレームを変更できました。

CGRect adjustedFrame = self.accessoryView.frame;
adjustedFrame.origin.x += 10.0f;
self.accessoryView.frame = adjustedFrame;
于 2013-09-24T19:20:55.310 に答える
3

これを行う別の方法は、セルのアクセサリ ビューとして設定された別のビューにカスタム アクセサリ ビューを埋め込み、フレームを使用してパディングを制御することです。

カスタム アクセサリ ビューとしてイメージ ビューを使用した例を次に示します。

// 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;
于 2014-01-15T13:22:56.510 に答える
2

上記の回答は、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);
    }
}
于 2013-08-02T12:59:17.053 に答える
2

多分これで十分でしょう:

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;

このように右側にパディングを追加したので、アクセサリ ボタンが左側にずれて見えます。唯一の副作用は、タッチに反応する領域が広いことです。

于 2013-06-27T09:45:34.770 に答える
1

私は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 では動作しています。

于 2012-08-14T12:07:04.667 に答える