UITableView setSeparatorInset 不能正常工作
Posted
技术标签:
【中文标题】UITableView setSeparatorInset 不能正常工作【英文标题】:UITableView setSeparatorInset does not work properly 【发布时间】:2014-08-06 19:08:08 【问题描述】:我正在尝试为 UITableView 中的分隔符自定义插入。这是我的 viewDidLoad 代码
- (void)viewDidLoad
[super viewDidLoad];
[self.tableView registerClass:[ChatTableCell class] forCellReuseIdentifier:@"ChatCell"];
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 65, 0, 0)];
如图所示,单元格分隔符插图无法正常工作。它适用于某些细胞,但不适用于其他细胞。我在这里做错了什么?
这就是我的 viewcontroller.m 文件的样子
#import "ChatListViewController.h"
@interface ChatListViewController ()
@end
@implementation ChatListViewController
- (id)initWithStyle:(UITableViewStyle)style
//self = [super initWithStyle:style];
self = [super initWithStyle:UITableViewStylePlain];
if (self)
self.parseClassName = kChatRoomClassKey;
self.paginationEnabled = YES;
self.pullToRefreshEnabled = YES;
self.objectsPerPage = 25;
//[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 65, 0, 0)];
return self;
- (PFQuery *)queryForTable
if (![PFUser currentUser])
PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
[query setLimit:0];
return query;
PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
[query whereKey:kChatRoomUsersKey equalTo:[PFUser currentUser]];
[query includeKey:kChatRoomUsersKey];
[query orderByDescending:@"updatedAt"];
[query setCachePolicy:kPFCachePolicyCacheThenNetwork];
// If no objects are loaded in memory, we look to the cache first to fill the table
// and then subsequently do a query against the network.
//
// If there is no network connection, we will hit the cache first.
if (self.objects.count == 0 || ![[UIApplication sharedApplication].delegate performSelector:@selector(isParseReachable)])
[query setCachePolicy:kPFCachePolicyCacheThenNetwork];
return query;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
static NSString *CellIdentifier = @"ChatCell";
ChatTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[ChatTableCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
[cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
[cell setSelectionStyle:UITableViewCellSelectionStyleGray];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
NSArray *users = [object objectForKey:kChatRoomUsersKey];
PFUser *cellUser = (PFUser *)[users objectAtIndex:0];
if ([cellUser.objectId isEqualToString:[PFUser currentUser].objectId])
cellUser = [users objectAtIndex:1];
NSLog(@"%@", cellUser);
cell.textLabel.font = [UIFont fontWithName:kDefaultFontKey size:17.0];
cell.detailTextLabel.font = [UIFont fontWithName:kDefaultFontLightKey size:14];
if ([cellUser isEqual:[NSNull null]])
cell.username.text = @"Selfie User";
cell.textLabel.font = [UIFont fontWithName:kDefaultFontKey size:17.0];
cell.latestText.text = [object objectForKey:kChatRoomLatestTextKey];
cell.detailTextLabel.font = [UIFont fontWithName:kDefaultFontKey size:10.0];
[cell.avatarImageView.profileImageView setImage:[UIImage imageNamed:@"AvatarPlaceholder.png"]];
else
cell.username.text = cellUser.username;
cell.textLabel.font = [UIFont fontWithName:kDefaultFontKey size:17.0];
cell.latestText.text = [object objectForKey:kChatRoomLatestTextKey];
cell.detailTextLabel.font = [UIFont fontWithName:kDefaultFontKey size:10.0];
if ([[cellUser fetchIfNeeded] objectForKey:kPAPUserProfilePicSmallKey] == nil)
[cell.avatarImageView.profileImageView setImage:[UIImage imageNamed:@"AvatarPlaceholder.png"]];
else
[cell.avatarImageView setFile:[cellUser objectForKey:kPAPUserProfilePicSmallKey]];
return cell;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
return 70.0f;
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
PFObject *chatRoomObject = [self.objects objectAtIndex:indexPath.row];
if ([[chatRoomObject objectForKey:kChatRoomReadKey] isEqual:@NO])
[chatRoomObject setObject:@YES forKey:kChatRoomReadKey];
[chatRoomObject saveEventually];
UITabBarItem *tabBarItem = [[self.tabBarController.viewControllers objectAtIndex:PAPFriendsTabBarItemIndex] tabBarItem];
NSString *currentBadgeValue = tabBarItem.badgeValue;
if (currentBadgeValue && currentBadgeValue.length > 1)
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
NSNumber *badgeValue = [numberFormatter numberFromString:currentBadgeValue];
NSNumber *newBadgeValue = [NSNumber numberWithInt:[badgeValue intValue] - 1];
tabBarItem.badgeValue = [numberFormatter stringFromNumber:newBadgeValue];
else
tabBarItem.badgeValue = @"";
ChatViewController *convoVC = [[ChatViewController alloc] init];
NSArray *users = [[self.objects objectAtIndex:indexPath.row] objectForKey:kChatRoomUsersKey];
PFUser *cellUser = (PFUser *)[users objectAtIndex:0];
if ([cellUser.objectId isEqualToString:[PFUser currentUser].objectId])
cellUser = [users objectAtIndex:1];
[convoVC setUser:cellUser];
[convoVC setChatRoom:[self.objects objectAtIndex:indexPath.row]];
[self.navigationController pushViewController:convoVC animated:YES];
- (void)viewDidLoad
[super viewDidLoad];
[self.tableView registerClass:[ChatTableCell class] forCellReuseIdentifier:@"ChatCell"];
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 65, 0, 0)];
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
[self.navigationItem setTitle:@"Chat"];
//Change Back button text
UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
initWithTitle: @""
style: UIBarButtonItemStyleBordered
target: nil action: nil];
[self.navigationItem setBackBarButtonItem: backButton];
[self.navigationController setDelegate:self];
-(void)viewDidAppear:(BOOL)animated
[self loadObjects];
//Google Analytics screen tracking
id tracker = [[GAI sharedInstance] defaultTracker];
[tracker set:kGAIScreenName
value:@"Chat"];
[tracker send:[[GAIDictionaryBuilder createScreenView] build]];
-(void)viewWillAppear:(BOOL)animated
[Flurry logEvent:@"Viewed Chat" timed:YES];
-(void)viewWillDisappear:(BOOL)animated
[Flurry endTimedEvent:@"Viewed Chat" withParameters:nil];
@end
【问题讨论】:
您希望separatorInset
以何种方式出现?就像第一行一样?
我想要它,就像它在第二行中所做的那样
您需要发布用于编辑 tableview 的所有方法的代码,因为其他地方可能存在问题导致 separatorInset
跳过第一行和第三行。
我编辑了我的问题以包含代码。谢谢
请添加数据源方法numberOfSectionsInTableView:
和numberOfRowsInSection:
的代码。
【参考方案1】:
经过我的所有解决方法,现在已在 ios 7 和 8 测试中修复。
-(void)viewDidLayoutSubviews
[customTableview setSeparatorInset:UIEdgeInsetsZero];
-(void)tableView:(UITableView *)tableView willDisplayCell:(customCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
[tableView setSeparatorInset:UIEdgeInsetsZero];
if ([tableView respondsToSelector:@selector(setLayoutMargins:)])
[tableView setLayoutMargins:UIEdgeInsetsZero]; // ios 8 newly added
if ([cell respondsToSelector:@selector(setLayoutMargins:)])
[cell setLayoutMargins:UIEdgeInsetsZero];
【讨论】:
以上是关于UITableView setSeparatorInset 不能正常工作的主要内容,如果未能解决你的问题,请参考以下文章
UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview
水平 UITableView 中的垂直 UITableView
如何与重叠显示的 UITableView 交互另一个 UITableView