46

次のようなメニューがあります。

メニュー

各セルの通常の (選択されていない) 状態は画像であり、選択された状態も画像です (デフォルトの青い状態のように見えます)。ただし、3 番目の画像を追加して、ユーザーがセルを選択すると、青 (選択) になる前にその 3 番目の色に一時的に変化するようにしたいと思います。

これは私のコードです:

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView setBackgroundColor:[UIColor clearColor]];

    NSString *cellIdentifier = @"MenuItemCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle  reuseIdentifier:cellIdentifier];
    }

    UIImage *cellBackgroundNormal = [UIImage imageNamed:@"cell_menu_normal"];
    UIImage *cellBackgroundSelected = [UIImage imageNamed:@"cell_menu_selected"];
    UIImageView *cellBackgroundView = [[UIImageView alloc] initWithImage:cellBackgroundNormal];
    UIImageView *cellBackgroundSelectedView = [[UIImageView alloc] initWithImage:cellBackgroundSelected];
    cell.backgroundView = cellBackgroundView;
    cell.selectedBackgroundView = cellBackgroundSelectedView;

    [cell.textLabel setBackgroundColor:[UIColor clearColor]];
    [cell.textLabel setTextColor:[UIColor whiteColor]];
    [cell.textLabel setFont:[UIFont boldSystemFontOfSize:17.0]];
    cell.textLabel.text = [self.menuItems objectAtIndex:indexPath.row];

    return cell;
} 

ご覧のとおり、現時点では 2 つの状態しかありません。cell.hoveredBackgroundView3 番目の画像に何らかの方法を導入する方法がわかりません。誰かがこれを実装するのを手伝ってくれるなら、本当に感謝しています。

4

15 に答える 15

32

Swift を使用する iOS 8.0 (およびそれ以降)

スイフト2

override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
}

override func tableView(tableView: UITableView, didHighlightRowAtIndexPath indexPath: NSIndexPath) {
    var cell = tableView.cellForRowAtIndexPath(indexPath)
    cell?.contentView.backgroundColor = UIColor.orangeColor()
    cell?.backgroundColor = UIColor.orangeColor()
}

override func tableView(tableView: UITableView, didUnhighlightRowAtIndexPath indexPath: NSIndexPath) {
    var cell = tableView.cellForRowAtIndexPath(indexPath)
    cell?.contentView.backgroundColor = UIColor.blackColor()
    cell?.backgroundColor = UIColor.blackColor()
}

スイフト3

override func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    return true
}

override func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    cell?.contentView.backgroundColor = UIColor.orange
    cell?.backgroundColor = UIColor.orange
}

override func tableView(_ tableView: UITableView, didUnhighlightRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    cell?.contentView.backgroundColor = UIColor.black
    cell?.backgroundColor = UIColor.black
}

ここに画像の説明を入力

于 2014-09-27T22:16:04.363 に答える
32

次のように UIAppearance を使用することもできます。

UIView *selectionView = [UIView new];
selectionView.backgroundColor = [UIColor redColor];
[[UITableViewCell appearance] setSelectedBackgroundView:selectionView];

これは、UITableViewCell またはそのサブクラスのすべてのインスタンスに適用されます。selectionStyleセルのプロパティが に 設定されていないことを確認してくださいUITableViewCellSelectionStyleNone

于 2015-05-29T11:44:44.883 に答える
14

受け入れられた答えよりも簡単:

UITableViewCell サブクラスで:

awakeFromNibまたはinit: _

self.selectionStyle = UITableViewCellSelectionStyleNone;

それで:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    [super setHighlighted:highlighted animated:animated];

    if (highlighted) {
        self.backgroundColor = [UIColor yourHighlightColor];
    }
    else {
        self.backgroundColor = [UIColor yourNormalColor];
    }
}
于 2015-04-09T17:04:10.210 に答える
0

次のコードを cellForRowAtIndexPath メソッドに追加します

var cell=tableView.dequeueReusableCellWithIdentifier("cell")!
var viewBG=UIView(frame: CGRectMake(0,0,self.view.frame.size.width,50))
viewBG.backgroundColor=UIColor(colorLiteralRed: 71.0/255.0, green: 121.0/255.0, blue: 172.0/255.0, alpha: 1)
cell.selectedBackgroundView=viewBG
于 2016-07-01T10:38:53.980 に答える
-4

タイマーを導入して、2 つの異なる背景色の間に必要な時間を設定できますか (理解できれば 1/2 秒など)。しかし、あなたはすでにそれについて考えているかもしれません:/

于 2013-04-28T17:51:53.440 に答える