7

Apple からの新しい UI 情報を調べましたが、役に立ちませんでした。

コードとスクリーンショットで、私が遭遇した問題を示しましょう。それが私のバグのあるコードではないことを確認するために、id 内に tableView を持つ UIViewController という単一のファイルを使用して、新しいプロジェクトを作成しました。代表者が設定されます。

私は次のことを行います:

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

    // Return the number of sections.
    return 3;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    return 3;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"UITableViewCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"%d",indexPath.row];
    // Configure the cell...

    UIView * redView = [[UIView alloc] initWithFrame:CGRectMake(0, -10, 100, 20)];
    redView.backgroundColor = [UIColor redColor];
    [cell addSubview:redView];

    return cell;
}

テーブルビューはGroupedに設定されています。iOS 6 で実行してみましょう:

もちろん、Y 原点は負です。はい、そうです。これが私が達成しようとしている結果です。iOS 7 で表示される内容を見てみましょう。

ヒント: 通常の UIView に redView を追加した場合は発生しません。

別のヒント: tableView の背景色を青に設定すると、セクション間の灰色の線は灰色ではなく青色になります (灰色が設定されたヘッダーではないことのデモンストレーションとして)。別のヒント: ipad についても同様です。

iOS 7 では、境界を超えるものをすべてカットするのはなぜですか? 助けてください!

4

3 に答える 3

8

これは、iOS 7 で UITableViewCells のビュー階層にいくつかの変更が導入されたためです。

以前はUITableViewCell view -> contentView.

今はもっと似ていUITableViewCell view -> scrollView -> contentViewます。

解決策はclipsToBounds = NO、scrollView に設定することです (デフォルトでは YES に設定されています)。そしてそれを達成する方法は、superviewプロパティを通じてです。

したがって、基本的に iOS6 以前では、コンテンツがセルの境界からはみ出すことを許可するには、次のようにします。

self.clipsToBounds = NO;                        //cell's view
self.contentView.clipsToBounds = NO;            //contentView

iOS7 では、スクロールビューがクリッピングしないようにする必要があるため、次のようにします。

self.clipsToBounds = NO;                        //cell's view
self.contentView.clipsToBounds = NO;            //contentView
self.contentView.superview.clipsToBounds = NO;  //scrollView

そして、私が使用する下位互換性のあるソリューションは次のとおりです。

self.clipsToBounds = NO;
self.contentView.clipsToBounds = NO;
if ([self.contentView.superview isKindOfClass:[NSClassFromString(@"UITableViewCellScrollView") class]]) self.contentView.superview.clipsToBounds = NO;

これは Hacky™ であり、iOS 8 でビュー階層が再び変更されると、問題が発生する可能性があることに注意してください。残念ながら、Apple は UITableViewCells からコンテンツをこぼすことを望んでいないようです。そのため、これが唯一の実行可能な解決策です。

于 2013-09-27T14:36:44.960 に答える
2

以下はそれを修正します:

cell.layer.masksToBounds = NO

ただし、セルアニメーションなど、他の何かが壊れる可能性があります。

あなたが抱えている問題は、セルがその境界外へのコンテンツの描画をサポートしていないという事実によって引き起こされます (実際には、スーパービューの境界を拡張するサブビューを使用することは常にハッキーな解決策です)。

最良のアドバイスは、再設計して、そのような機能をまったく回避することです。

別の解決策として、同じビューを前のセルの下部に追加するか、それらをサブビューとしてUITableView直接追加することができます。

于 2013-09-18T10:27:54.120 に答える
2

内容が実際にトリミングされているとは思いませんがmasksToBounds、ビューは他の (不透明な) セルで覆われています。UITableViewサブビューの順序 (「z-Index」) を変更しbringSubviewToFront:、セルが表示されるたびに同様の方法を使用して、画面の下端に最も近いセルがすべての最前面ビューになるようにすることで、修正を試みることができます。細胞。

于 2013-09-18T10:33:10.587 に答える