2014年1月5日 星期日

隱藏 UITableViewCell 的 Edit Control [For iOS 7]

根據之前的 隱藏 UITableViewCell 的 Edit Control 做到了隱藏的效果了,
不過這個作法在 iOS 7 上卻失效了,因為 iOS 7 的 Cell 的 Subview 結構改變了,
所以之前的教學就失效了,因此再度為 iOS 7 多開一次教學。

首先照上次的教學先做一次看看現在的 Cell 的 Subview 結構變成了什麼?

在 iOS 7 的時候 Cell 的 Subview 竟然只剩下 UITableViewCellScrollView 一個!
那個其他的 view 去哪了?

不管怎樣,先看看 UITableViewCellScrollView 裡面有什麼東西,
用跟上次一樣的作法,log 看看 UITableViewCellScrollView 有什麼 subviews
- (void)layoutSubviews
{
	[super layoutSubviews];
	
	if (self.editing) {
		UIView *subview = self.subviews.lastObject;
		
		if ([self.subviews count] == 1 && [NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellScrollView"]) {
			NSLog(@"%@", subview.subviews);
		}
	}
	
}

結果如下,竟然! UITableViewCellScrollView 內部是包著那些消失的 View!

既然這樣子就照著之前的作法將它給隱藏起來。
- (void)layoutSubviews
{
	[super layoutSubviews];
	
	if (!self.editing) {
		return;
	}
	
	void (^enumBlock) (id, NSUInteger, BOOL *) = ^(UIView *subview, NSUInteger idx, BOOL *stop) {
		if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellEditControl"]) {
			[subview setHidden:YES];
	    
			*stop = YES;
		}
	};
	
	UIView *subview = self.subviews.lastObject;
	
	if ([self.subviews count] == 1 && [NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellScrollView"]) {
		[subview.subviews NSEnumerationReverse
	}
}

如果你需要支援 iOS7 以下的版本的話就可以這樣子用。
- (void)layoutSubviews
{
	[super layoutSubviews];
	
	if (!self.editing) {
		return;
	}
	
	void (^enumBlock) (id, NSUInteger, BOOL *) = ^(UIView *subview, NSUInteger idx, BOOL *stop) {
		if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellEditControl"]) {
			[subview setHidden:YES];
	    
			*stop = YES;
		}
	};
	
	UIView *subview = self.subviews.lastObject;
	
	if ([self.subviews count] == 1 && [NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellScrollView"]) {
		[subview.subviews enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:enumBlock];
		
		return;
	}
	
	[self.subviews enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:enumBlock];
}

1 則留言:

Eveian 提到...
作者已經移除這則留言。