我在定制一个UITableView。我想隐藏在最后一个单元格上的分离线…我能这样做吗?
我知道我可以用tableView。separatorStyle = UITableViewCellStyle。没有,但是这会影响tableView的所有单元格。我希望它只影响最后一个单元格。
我在定制一个UITableView。我想隐藏在最后一个单元格上的分离线…我能这样做吗?
我知道我可以用tableView。separatorStyle = UITableViewCellStyle。没有,但是这会影响tableView的所有单元格。我希望它只影响最后一个单元格。
当前回答
更简单、更符合逻辑的做法是:
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
return [[UIView alloc] initWithFrame:CGRectZero];
}
在大多数情况下,您不希望只看到最后一个表视图单元格分隔符。这种方法只删除了最后一个表格视图单元格分隔符,你不需要考虑自动布局问题(即旋转设备)或硬编码值来设置分隔符嵌入。
其他回答
试试下面的代码,也许能帮你解决问题
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString* reuseIdentifier = @"Contact Cell";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if (nil == cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (indexPath.row != 10) {//Specify the cell number
cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithLine.png"]];
} else {
cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithOutLine.png"]];
}
}
return cell;
}
正如(许多)其他人指出的那样,你可以通过简单地关闭整个UITableView本身来轻松隐藏所有UITableViewCell分隔符;例如在你的UITableViewController中
- (void)viewDidLoad {
...
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
...
}
不幸的是,在每个单元格的基础上,这是一个真正的PITA,这是你真正要求的。
就我个人而言,我已经尝试了许多改变cell.separatorInset的排列。正如(许多)其他人所建议的那样,再次向左,但问题是,引用苹果的话(强调):
"...您可以使用此属性在当前单元格内容与表的左右边缘之间添加空格。正插入值将单元格内容和单元格分隔符向内移动,远离表格边缘……”
因此,如果你试图通过将分隔符推到屏幕的右侧来“隐藏”分隔符,你最终也会缩进你的单元格的contentView。正如crifan所建议的,您可以尝试通过设置cell来补偿这种讨厌的副作用。indentationWidth和cell。indentationLevel适当地将所有内容移回,但我发现这也是不可靠的(内容仍然缩进…)
我发现的最可靠的方法是在一个简单的UITableViewCell子类中覆盖layoutSubviews,并设置右插入,使它命中左插入,使分隔符有0宽度,因此不可见[这需要在layoutSubviews中自动处理旋转]。我还向我的子类添加了一个方便的方法来打开它。
@interface MyTableViewCellSubclass()
@property BOOL separatorIsHidden;
@end
@implementation MyTableViewCellSubclass
- (void)hideSeparator
{
_separatorIsHidden = YES;
}
- (void)layoutSubviews
{
[super layoutSubviews];
if (_separatorIsHidden) {
UIEdgeInsets inset = self.separatorInset;
inset.right = self.bounds.size.width - inset.left;
self.separatorInset = inset;
}
}
@end
警告:没有一个可靠的方法来恢复原始的右插入,所以你不能“取消隐藏”分隔符,因此我为什么要使用一个不可逆的hideSeparator方法(vs暴露separatorIsHidden)。请注意,separatorInset在重用的单元格之间持续存在,因为你不能“取消隐藏”,你需要将这些隐藏的分隔单元格隔离在它们自己的reuseIdentifier中。
使用Swift 3并采用最快的黑客方法,您可以使用扩展来改进代码:
extension UITableViewCell {
var isSeparatorHidden: Bool {
get {
return self.separatorInset.right != 0
}
set {
if newValue {
self.separatorInset = UIEdgeInsetsMake(0, self.bounds.size.width, 0, 0)
} else {
self.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
}
}
}
}
然后,当你配置单元格时:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath)
switch indexPath.row {
case 3:
cell.isSeparatorHidden = true
default:
cell.isSeparatorHidden = false
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath)
if cell.isSeparatorHidden {
// do stuff
}
}
iphone的宽度是320。因此,在单元格属性中为separatorInset设置左右值,大于320的一半。
所有答案的代码将使单元格填充为零,而不是默认值。我在iOS 11 iPad Pro 12中看到了这个问题。”
但我有一个解决方案(“肮脏的hack”),那就是使一个空的部分,将使分隔线隐藏。
下面是我使用的代码:
typedef enum PXSettingsTableSections {
PXSettingSectionInvite = 0,
PXSettingSectionAccount,
PXSettingSectionPrivacy,
PXSettingSectionCreation,
PXSettingSectionTest,
PXSettingSectionAboutHide, // invisble section just to hide separator Line
PXSettingSectionFooterHide, // invisble section just to hide separator Line
PXSettingSectionNumItems,
} PXSettingsTableSectionsType;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return PXSettingSectionNumItems;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case PXSettingSectionInvite: return 1;
case PXSettingSectionAccount:return (isSocialLogin) ? 1 : 2;
case PXSettingSectionPrivacy: return 1;
case PXSettingSectionCreation: return 2;
case PXSettingSectionTest: return 3;
case PXSettingSectionAboutHide: return 3;
default: return 0;
}
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
switch(section)
{
case PXSettingSectionInvite: return nil;
case PXSettingSectionAccount: return @"Account";
case PXSettingSectionPrivacy: return @"Privacy";
case PXSettingSectionCreation: return @"Someting";
case PXSettingSectionTest: return @"Test";
case PXSettingSectionAboutHide: return @" ";
case PXSettingSectionFooterHide: return @" ";
}
return nil;
}
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
if (section == PXSettingSectionFooterHide || section == PXSettingSectionAboutHide) {
// [UIColor clearColor] will not work
[header.contentView setBackgroundColor:[UIColor whiteColor]];
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
// You can control here the size of one specific section
if(section == PXSettingSectionAboutHide){
return 0.0000001; //make it real small
}
return 45.0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
switch(indexPath.section)
{
case PXSettingSectionInvite:
return self.inviteCell;
case PXSettingSectionAccount:
if (isSocialLogin) {
return self.myWalletCell;
}
switch(indexPath.row)
{
case 0: return self.changePasswordCell;
case 1: return self.myWalletCell;
}
case PXSettingSectionPrivacy:
switch(indexPath.row)
{
case 0: return self.privateAccountCell;
}
case PXSettingSectionCreation:
switch(indexPath.row)
{
case 0: return self.videoResolutionCell;
case 1: return self.selfieMirrorCell;
}
case PXSettingSectionTest:
switch(indexPath.row)
{
case 0: return self.termsOfUseImageCell;
case 1: return self.attributionCell;
case 2: return self.aboutCell;
}
case PXSettingSectionAboutHide:{
switch(indexPath.row)
{
case 0: return self.clearCacheCell;
case 1: return self.feedbackCell;
case 2: return self.logoutCell;
}
}
}
return self.emptyCell;
}