UITableViewController
1 つのセクションと 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;
}
これは、ペン先を使用していないときに得られるものです(横向きの場合は違いはありません):
そして、これは私がペン先で得たものです(風景に合わせて適切にスケーリングされます):