Interface Builder keeps resetting the width of my

2020-05-23 02:35发布

I'm using Interface Builder to design a custom UITableViewCell for an iPad application.

I have a dedicated XIB file which has a UITableViewCell as its root view. I am able to change the width of the UITableViewCell to 1024 (in the Size inspector on the right properties pane of XCode) and this DOES resize the cell on the canvas temporarily.

However if afterwards I try to move/resize certain items within the UITableViewCell or close and reopen the XIB, XCode decides to reset the UITableViewCell's width back to 320 (the iPhone specific width).

The cell on the canvas then obscures the items within the cell and makes designing the cell impossible unless I resize the cell again. Once you've gone round this loop a few times it gets rather annoying.

Anyone know how I might set the width so its permanent or some how specify that the UITableViewCell is iPad specific?


To recreate...

  • File > New > File...
  • UserInterface > Empty
  • Device Family == iPad

  • Drag a new UITableViewCell onto the canvas (its created with a width of 320 despite selecting iPad previously)

  • Resize the UITableViewCell's width to 1024 (all good so far)
  • Drag and drop a UILabel onto the left side of the UITableViewCell (still good)
  • Resize the UILabel in any way by dragging a corner (DO NOT USE THE ATTRIBUTES INSPECTOR) - AND... The UITableViewCell's size is reset back to 320

EDIT:

I have just received the following response from Apple to the Radar ticket I created ages ago...

Hello Oliver,

This is a follow-up regarding regarding Bug ID# 13222753.

Engineering has requested the following information in order to further investigate this issue:

We believe this issue has been addressed in the latest Xcode 5.1 Seed.

This is a pre-release version of the Xcode developer toolset for Mac, iPhone, and iPad. It includes the Xcode IDE, iOS Simulator, and all required tools and frameworks for building OS X and iOS apps. Please test with this release, and update your bug report with the results.

Xcode 5.1 Seed - Build 5B71f Posted Date: Dec 13, 2013

I've also just tried to recreate the problem in Xcode 5.0.2 and it looks like its fixed with that build also.

4条回答
冷血范
2楼-- · 2020-05-23 03:01

I confirm that Edward Huynh's answer is correct. At the same time, I could not have afforded to turn off autolayout, change the height, turn the autolayouts back again. This would require me to redo all autolayout settings for each subview of the content view.

I was just experimenting and found out that opening xib file in TextEdit and changing the width & height of the tableViewCell and the tableViewCellContentView will actually retain all autolayouts and the size of the cell is updated. Few of the constraints' constant values will now be obsolete which can easily be fixed by using "update constraints" on such constraints.

enter image description here

查看更多
等我变得足够好
3楼-- · 2020-05-23 03:02

The workaround is to not add a Table View Cell to your nib. Instead, use a regular View to contain your subviews.

Create a custom UITableViewCell class that loads the nib and sets the top-level nib view as the subview of the cell content view:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self) {
        UINib *nib = [UINib nibWithNibName:@"YourNibName" bundle:nil];
        UIView* containerView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
        containerView.translatesAutoresizingMaskIntoConstraints = NO
        [self.contentView addSubview:containerView];

        NSDictionary *views = NSDictionaryOfVariableBindings(containerView);
        [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[containerView]|" options:0 metrics:nil views:views]];
        [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[containerView]|" options:0 metrics:nil views:views]];
    }

    return self;
}

Register your class with the table view:

[tableView registerClass:YourCellClass forCellReuseIdentifier:@"YourCellID"]`
查看更多
够拽才男人
4楼-- · 2020-05-23 03:22

I just did a test and had no problems resizing the cell. It did make no difference, if the Xib was created with the 'for iPhone' or 'for iPad' option. So, this works as expected.

The trick is, not to drag the size but, to use the Inspector to change the width - this leaves the cell at it's size of 1024.

查看更多
三岁会撩人
5楼-- · 2020-05-23 03:25

I don't know if you consider this a valid answer, but the problem only seemed to occur for me when I was using autolayout in IB. If I turn that off, the problem of Xcode resizing the UITableViewCell goes away.

To turn off autolayout, just select the UITableViewCell and then on the right in the 'File inspector', there is a checkbox for autolayout to turn it off.

查看更多
登录 后发表回答