我知道你可能不希望覆蓋蘋果整個執行編輯表格視圖單元格,但我有一個類似的問題,我的應用程序。在我的情況下,我需要兩個按鈕(更多和丟失)來顯示,就像在用戶從左向右滑動時iOS7的新提醒應用中一樣。代替使用:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
我創建的隱藏頂層下面的按鈕,並使用一個平移手勢識別器來移動頂層,顯示所述按鈕下方的自定義單元格。因此,我可以完全控制顯示哪些按鈕以及它們是什麼顏色(見下文)。
static CGFloat const kEditButtonWidth = 82.0;
@interface MyCustomCell()
@property (nonatomic, assign) CGFloat firstX;
@property (nonatomic, assign) CGFloat firstY;
@property (nonatomic, strong) UIView *topLayer;
@property (nonatomic, strong) UIButton *moreButton;
@property (nonatomic, strong) UIButton *lostButton;
@property (nonatomic, strong) UILabel *titleLabel;
@end
@implementation MyCustomCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (self) {
// BOTTOM LAYER (MORE AND LOST BUTTONS)
UIButton *aButton = [UIButton buttonWithType:UIButtonTypeCustom];
[aButton setFrame:CGRectZero];
[aButton setTitle:@"More" forState:UIControlStateNormal];
[aButton setTitleShadowColor:[UIColor clearColor] forState:UIControlStateNormal];
[aButton setBackgroundColor:[UIColor colorWithRed:0.78 green:0.78 blue:0.78 alpha:1.0]];
[[self contentView] addSubview:aButton];
[self setMoreButton:aButton];
aButton = [UIButton buttonWithType:UIButtonTypeCustom];
[aButton setFrame:CGRectZero];
[aButton setTitle:@"Lost" forState:UIControlStateNormal];
[aButton setTitleShadowColor:[UIColor clearColor] forState:UIControlStateNormal];
[aButton setBackgroundColor:[UIColor colorWithRed:1.00f green:0.23f blue:0.19f alpha:1.00f]];
[[self contentView] addSubview:aButton];
[self setLostButton:aButton];
// TOP LAYER
UIView *aView = [[UIView alloc] initWithFrame:CGRectZero];
[aView setBackgroundColor:[UIColor whiteColor]];
[[self contentView] addSubview:aView];
[self setTopLayer:aView];
UIPanGestureRecognizer *aPanRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureAction:)];
[aPanRecognizer setMinimumNumberOfTouches:1];
[aPanRecognizer setMaximumNumberOfTouches:1];
[aView addGestureRecognizer:aPanRecognizer];
// title label
UILabel *aLabel = [[UILabel alloc] initWithFrame:CGRectZero];
[aView addSubview:aLabel];
[self setTitleLabel:aLabel];
}
return self;
}
- (void)layoutSubviews {
[super layoutSubviews];
CGRect bounds = [[self contentView] bounds];
CGRect frame = CGRectZero;
// BOTTOM LAYER (MORE AND LOST BUTTONS)
frame.origin.x = bounds.size.width-(kEditButtonWidth+kEditButtonWidth); // two buttons wide
frame.size.width = kEditButtonWidth;
frame.size.height = bounds.size.height;
[[self moreButton] setFrame:frame];
frame.origin.x += kEditButtonWidth;
[[self lostButton] setFrame:frame];
// TOP LAYER
frame = bounds;
CGPoint anchorPoint = CGPointMake(0.0f, [[[self topLayer] layer] anchorPoint].y);
[[[self topLayer] layer] setAnchorPoint:anchorPoint];
[[self topLayer] setFrame:frame];
// title label
frame.origin.x = 20.0;
frame.origin.y = 4.0;
frame.size.width = bounds.size.width-40.0;
frame.size.height = 21.0;
[[self titleLabel] setFrame:frame];
}
- (void)panGestureAction:(id)sender {
// on the first touch, get the center coordinates (x and y) of the view
CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self];
if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) {
[self setFirstX:[[sender view] center].x];
[self setFirstY:[[sender view] center].y];
}
// add translated point to reference points
translatedPoint = CGPointMake([self firstX]+translatedPoint.x, [self firstY]);
[[sender view] setCenter:translatedPoint];
// when pan ends (set final x to be either back to zero or showing buttons)
if ([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {
CGFloat finalX = translatedPoint.x+(0.30*[(UIPanGestureRecognizer*)sender velocityInView:self].x);
if (finalX < -1.0f*FMEditButtonWidth) {
finalX = -2.0f*FMEditButtonWidth;
[self setEditMode:YES];
} else {
finalX = 0.0f;
[self setEditMode:NO];
}
// animate view
[UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:1.0f initialSpringVelocity:1.0f options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState animations:^{
[[sender view] setCenter:CGPointMake(finalX, [self firstY])];
} completion:NULL];
}
}
@end
希望這會有所幫助。
可能重複:http://stackoverflow.com/questions/17254402/swipe-to-delete-and-the-more-button-像在郵件應用程序上的IOS 7 – Krumelur
沒有。也沒有正確回答。 –
對於「如何調整你不應該調整的UI層次結構」沒有正確的答案 - 它永遠是一個破解。第二和第三個答案看起來非常像一個有效的方法。 – Krumelur