1

UITableViewController1 つのセクションと 1 つのセル (テスト ケース) を表示する があります。そのセル内にはUITextField、セルの長さにまたがる があり、contentView両側に 20 ポイント (つまりH:|-20-[field]-20-|) があり、垂直方向に中央に配置されます。必要な制約のあるペン先を使用すると完全に機能しますが、プログラムで制約を追加すると、それらのどれにも従わないようです。(画像参照)

NSLog()印刷されているは-tableView:willDisplayCell:forRowAtIndexPath:、両方のケースでまったく同じ制約です。

FOOAppDelegate.m:

#import "FOOAppDelegate.h"
#import "FOORootViewController.h"

@implementation FOOAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    UINavigationController *controller = [[UINavigationController alloc] initWithRootViewController:[[FOORootViewController alloc] initWithStyle:UITableViewStyleGrouped]];
    self.window.rootViewController = controller;
    [self.window makeKeyAndVisible];
    return YES;
}

@end

FOORootViewController.m: (注: UITextFieldDelegate として宣言されています)

#import "FOORootViewController.h"

enum { kFOOTextFieldTag = 0xFEED /* Arbitrary. */ };

@implementation FOORootViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        self.title = @"Foo";
        self.navigationItem.rightBarButtonItem = self.editButtonItem;
    }
    return self;
}

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];
    [self.tableView reloadData];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"FooCell";
    /* Uncomment the following line when using nib. */
    //[self.tableView registerNib:[UINib nibWithNibName:@"FooCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:CellIdentifier];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    /* Comment this if block when using nib. */
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    /* Comment this if block when using nib. */
    if (self.editing && ([cell.contentView viewWithTag:kFOOTextFieldTag] == nil)) {
        UITextField *field = [[UITextField alloc] init];
        field.autocapitalizationType = UITextAutocapitalizationTypeSentences;
        field.borderStyle = UITextBorderStyleLine;
        field.delegate = self;
        field.placeholder = @"New";
        field.tag = kFOOTextFieldTag;
        field.translatesAutoresizingMaskIntoConstraints = NO;
        field.userInteractionEnabled = YES;
        [cell.contentView addSubview:field];

        NSDictionary *objs = NSDictionaryOfVariableBindings(cell.contentView, field);
        cell.contentView.translatesAutoresizingMaskIntoConstraints = NO;
        [cell.contentView addConstraints:[NSLayoutConstraint
            constraintsWithVisualFormat:@"V:|-7-[field]"
            options:0
            metrics:nil
            views:objs]];
        [cell.contentView addConstraints:[NSLayoutConstraint
            constraintsWithVisualFormat:@"V:[field]-6-|"
            options:0
            metrics:nil
            views:objs]];
        [cell.contentView addConstraints:[NSLayoutConstraint
            constraintsWithVisualFormat:@"H:|-20-[field]"
            options:0
            metrics:nil
            views:objs]];
        [cell.contentView addConstraints:[NSLayoutConstraint
            constraintsWithVisualFormat:@"H:[field]-20-|"
            options:0
            metrics:nil
            views:objs]];
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITextField *field = (UITextField *)[cell.contentView viewWithTag:kFOOTextFieldTag];
    if (self.editing) {
        field.hidden = NO;

        NSLog(@"field: %@", field);
    } else {
        field.hidden = YES;
    }

    NSLog(@"cell.contentView: %@", cell.contentView);
    NSLog(@"constraints: %@", cell.contentView.constraints);
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellEditingStyleInsert;
}

これは、ペン先を使用していないときに得られるものです(横向きの場合は違いはありません): プログラムによる自動レイアウト

そして、これは私がペン先で得たものです(風景に合わせて適切にスケーリングされます): IB 自動レイアウト

4

1 に答える 1

1

この行を削除すると、正しく機能します。

cell.contentView.translatesAutoresizingMaskIntoConstraints = NO;

自分で追加するサブビューに対してのみ NO に設定する必要があります。

また、cellForRowAtIndexPath に nib を登録していることに気付きました (nib を使用している場合)。cellForRowAtIndexPath は何度も呼び出されるため、これを行うべきではありません。そのコードをviewDidLoadに入れる必要があります。

もう1つ-制約コードを簡素化する必要があります。ビジュアル フォーマット言語を使用する大きな利点は、同じステートメントで複数の制約を設定できるため、4 つのステートメントを 2 つに結合できることです。

cell.contentView addConstraints:[NSLayoutConstraint
                                          constraintsWithVisualFormat:@"V:|-7-[field]-6-|"
                                          options:0
                                          metrics:nil
                                          views:objs]];

cell.contentView addConstraints:[NSLayoutConstraint
                                          constraintsWithVisualFormat:@"H:|-20-[field]-20-|"
                                          options:0
                                          metrics:nil
                                          views:objs]];
于 2013-11-11T03:38:26.310 に答える