I have made a custom UITableViewCell, and done it properly (adding everything to contentView
, and overriding layoutSubviews
so my subviews are rela
Nick Weaver's updated answer works great, except for the issue that Rec Levy pointed out:
Only thing now is that when you swipe-to-delete and then cancel (click elsewhere on the screen) the cell suddenly skips to the left and then slides back as the delete button disappears
I ran into the same problem. I'm not sure why it's occurring, but disabling animations while setting the contentView frame resolves it.
...
[UIView setAnimationsEnabled:NO];
self.contentView.frame = CGRectMake(indentPoints,
self.contentView.frame.origin.y,
self.contentView.frame.size.width - indentPoints,
self.contentView.frame.size.height);
[UIView setAnimationsEnabled:YES];
You've got to override layoutSubviews
and do something like the following. And don't forget to set the indentation level to something greater than 0 :) For custom cells the indentation level is not applied by default.
To avoid indentation for the single swipe to delete gesture you'll have to do a but more work. There is a state which reflects the editing state of the cell.It is not public but can be accessed with - (void)willTransitionToState:(UITableViewCellStateMask)aState
, so storing it in a property does the work for layoutViews.
Apple's documentation for willTransitionToState:
Note that when the user swipes a cell to delete it, the cell transitions to the state identified by the UITableViewCellStateShowingDeleteConfirmationMask constant but the UITableViewCellStateShowingEditControlMask is not set.
header file
int state;
...
@property (nonatomic) int state;
...
cell implementation
@synthesize state;
...
- (void)layoutSubviews
{
[super layoutSubviews];
self.contentView.frame = CGRectMake(0,
self.contentView.frame.origin.y,
self.contentView.frame.size.width,
self.contentView.frame.size.height);
if (self.editing
&& ((state & UITableViewCellStateShowingEditControlMask)
&& !(state & UITableViewCellStateShowingDeleteConfirmationMask)) ||
((state & UITableViewCellStateShowingEditControlMask)
&& (state & UITableViewCellStateShowingDeleteConfirmationMask)))
{
float indentPoints = self.indentationLevel * self.indentationWidth;
self.contentView.frame = CGRectMake(indentPoints,
self.contentView.frame.origin.y,
self.contentView.frame.size.width - indentPoints,
self.contentView.frame.size.height);
}
}
- (void)willTransitionToState:(UITableViewCellStateMask)aState
{
[super willTransitionToState:aState];
self.state = aState;
}