5

編集:

カスタマイズセルを作成することで問題は解決しまし

Cory の答えは問題を解決しませんclipsToBoundsでしたが、本当にポイントであり、彼の継続的な助けに感謝します. だから私は彼に報奨金を与えますが、彼の答えを答えとして受け入れません. 答えはまだ風の中....

================================

UIViewContentModeScaleセル画像のモードを(左画像)に設定するAspectFillと、画像が正しく表示されました(画像ビューを塗りつぶしますが、アスペクトは維持されます)。ただし、セルを長押しすると、画像が変更されます。imageView のフレームと contentViewMode が変更されます。(下の左の画像の最初のセルを参照してください)

これは本当に配線されており、基本的なことがうまくいかない可能性があると私は信じているので、私が見逃していたものがあるに違いありません.

環境: Xcode 4.3 iOS5.1 シミュレーター & デバイス。 ここに画像の説明を入力

アップデート:

ストーリーボードのインスペクターを使用して UIViewContentMode を設定しました。

ちなみにSDWebImage/UIImageView+WebCache.hを使用しました。

更新2:

コードでコンテンツ モードを明示的に設定しましたが、まだ問題があります。[cell.imageView setContentMode:UIViewContentModeScaleAspectFill];

update4:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AlbumCell"];

    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"AlbumCell"];

    }
    //[cell.imageView setContentMode:UIViewContentModeScaleAspectFill];
    //[cell.imageView setClipsToBounds:YES];
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    Album *album = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = [album.title description];    
    cell.detailTextLabel.text = [self.userVisiableDateFormatter stringFromDate:album.releaseDate];


    //[cell.imageView setContentMode:UIViewContentModeScaleAspectFill];
    [cell.imageView setImageWithURL:[NSURL URLWithString:album.coverThumbnailUrl]
                placeholderImage:[self placeHolderImage]];

}

ここに画像の説明を入力

4

4 に答える 4

9

問題になる可能性のあるいくつかの異なるものを見つけることができました。

まず、clipsToBoundsプロパティを設定してみます。

img1.contentMode = UIViewContentModeScaleAspectFill; 
img1.clipsToBounds = YES;

2番目は:

これらのモードに違いが見られない理由は、UITableViewCellが画像のアスペクト比に合うように画像ビューのサイズを自動的に変更するためです。コンテンツモードは、ビューのアスペクト比が画像のアスペクト比と異なる場合にのみ機能します。

カスタムUITableViewCellクラスのlayoutSubviewsをオーバーライドするか、自分で画像ビューを作成します(テーブルビューセルが提供するものは使用しないでください)。

編集1:

コードを見た後、問題はセル構成の処理方法にある可能性があります。ポインタは、解放されるべきではないときに解放される可能性があります。次の2つのオプションを試してください。

オプション1:構成を新しいメソッドに渡す現在のメソッドを維持します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AlbumCell"];

    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"AlbumCell"];

    }

    return [self configureCell:cell atIndexPath:indexPath];
}

- (UITableViewCell*)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell* returnCell = cell;

    Album *album = [self.fetchedResultsController objectAtIndexPath:indexPath];
    returnCell.textLabel.text = [album.title description];    
    returnCell.detailTextLabel.text = [self.userVisiableDateFormatter stringFromDate:album.releaseDate];


    [returnCell.imageView setContentMode:UIViewContentModeScaleAspectFill];
    [returnCell.imageView setClipsToBounds:YES];

    [returnCell.imageView setImageWithURL:[NSURL URLWithString:album.coverThumbnailUrl]
                placeholderImage:[self placeHolderImage]];

    return returnCell;
}

オプション2:(私の推奨)delegateメソッドでセルを構成します。ここでこれを行うことは問題ありませんが、悪い習慣ではありません。これは、セルを構成するためのデリゲートメソッドです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AlbumCell"];

    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"AlbumCell"];

    }


    Album *album = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = [album.title description];    
    cell.detailTextLabel.text = [self.userVisiableDateFormatter stringFromDate:album.releaseDate];

    [cell.imageView setContentMode:UIViewContentModeScaleAspectFill];
    [cell.imageView setClipsToBounds:YES];

    [cell.imageView setImageWithURL:[NSURL URLWithString:album.coverThumbnailUrl]
                placeholderImage:[self placeHolderImage]];


    return cell;
}
于 2012-07-26T18:04:39.117 に答える
3

ハイライト状態にも同じ画像を設定します。

于 2012-07-27T08:06:53.790 に答える
3

自動サイズ変更を設定する必要がある場合があります (または、その用語を習得している場合は、ストラットとスプリング)。

左側にあなたの画像に似たカスタムセルがあるアプリでは、次の図のように自動サイズ変更を設定しています:

ここに画像の説明を入力

サイズがセルフレーム内で一定になるように設定していることに注意してください。また、上、下、左のサイズは、両側に大きなギャップがあるエッジを抱き締めるように命令されていることに注意してください。

それを除けば、aspectFillがその設定の選択であることは正しいと思います。clipToBounds は本当に重要ではありません。そのビューが、サブビューであるビューよりもサイズが大きい場所に表示されるはずの別のビューのサブビューである場合にのみ必要になります。

于 2012-08-01T06:17:37.360 に答える
2

サブクラス化された UIImageView プロパティを持つサブクラス化された UITableViewCell で同様の問題が発生しました。このプロパティの名前を「imageView」から別の名前に変更すると、問題が解決しました。

于 2013-05-23T23:14:50.890 に答える