UITableView 自定义 UIView 重复
UITableView custom UIView duplicates
因此,客户的规范希望 UITableView 始终显示其中一行,以便用户可以在 UITableView 的任何位置与这个关键按钮进行交互。一旦他滚动并看到带有按钮的实际行,浮动页脚必须消失并允许用户与 'real' 单元格交互,而不是浮动版本。
我想出了以下代码:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if([self isPostularmeRowVisible])
{
[self hidePostularmeFooterView];
}
else
{
[self showPostularmeFooterView];
}
}
-(BOOL)isPostularmeRowVisible
{
NSArray *indexes = [self.tableView indexPathsForVisibleRows];
for (NSIndexPath *index in indexes)
{
if (index.row == 0 && index.section>=DetalleEmpleoPostularmeCell)
{
return YES;
}
}
return NO;
}
-(void) showPostularmeFooterView
{
NSAssert(_state==ESTADO_POSTULACION_NO_POSTULADO, @"NJDetalleEmpleoViewController: This shouldn't happen");
if(!self.footerView)
{
NJDetalleEmpleoPostularmeTableViewCell *footerView = [self.tableView dequeueReusableCellWithIdentifier:kDetalleEmpleoPostularmeCell];
[footerView configureCell:self.detaleAviso];
float h = self.view.frame.size.height-footerView.cellHeight;
footerView.frame = CGRectMake(0,h,self.view.frame.size.width,footerView.cellHeight);
footerView.delegate = self;
self.footerView = footerView;
[self.view addSubview:self.footerView];
[self.view bringSubviewToFront:self.footerView];
}
}
-(void) hidePostularmeFooterView
{
if(self.footerView)
{
[self.footerView removeFromSuperview];
}
self.footerView = nil;
}
但是这段代码有一个我似乎无法弄清楚的错误:一旦用户在 UITextBox 上点击并输入一些文本,它就会开始表现不稳定,即:屏幕上出现 2 个或更多单元格,当出现应该是none!基本上,当我调用方法 'hidePostularmeFooterView' 时,它似乎并没有消失(只有在我输入一些文本后,如果我不与之交互,它才能正常工作)。
在我输入一些文字后,似乎有两个版本的页脚,证据如下:
将其作为单元格和页脚删除并在 UITableView
下方将其替换为自己的 UIView
并让 UITableView
框架高度只下降到这个视图的 y 原点,而不是占据整个屏幕。这样您就可以随时看到视图并与之交互。有什么理由需要它成为 UITableViewCell
吗?
我不会碰 footerView,而是创建一个出现的自定义视图,如下所示:
dataSource = [NSMutableArray new];
for (int n = 0; n < 100; n++){
[dataSource addObject:[NSString stringWithFormat:@"%i",n]];
}
table = [UITableView new];
table.frame = self.view.bounds;
table.delegate = self;
table.dataSource = self;
[self.view addSubview:table];
popUpView = [UIImageView new];
popUpView.frame = CGRectMake(0, h-200, w, 200);
popUpView.image = [UIImage imageNamed:@"Grumpy-Cat.jpg"];
popUpView.contentMode = UIViewContentModeScaleAspectFill;
popUpView.clipsToBounds = true;
popUpView.layer.borderColor = [UIColor redColor].CGColor;
popUpView.layer.borderWidth = 2.0f;
[self.view addSubview:popUpView];
像往常一样设置 tableView,在 scrollViewDidScroll 方法中,你可以像这样粘贴:
NSIndexPath * specialRow = [NSIndexPath indexPathForRow:50 inSection:0];
NSArray * indices = table.indexPathsForVisibleRows;
if ([indices containsObject:specialRow]){
if (isShowing){
isShowing = false;
[UIView animateWithDuration:1.0f
delay:0.0f
usingSpringWithDamping:1.0f
initialSpringVelocity:0.8f
options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
animations:^{
popUpView.transform = CGAffineTransformMakeTranslation(0, popUpView.frame.size.height + 10);
}
completion:^(BOOL finished){
}];
}
} else if (!isShowing) {
isShowing = true;
[UIView animateWithDuration:1.0f
delay:0.0f
usingSpringWithDamping:1.0f
initialSpringVelocity:0.8f
options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
animations:^{
popUpView.transform = CGAffineTransformIdentity;
}
completion:^(BOOL finished){
}];
}
其中 isShowing 是一个跟踪 popUpView 状态的布尔值。这是快速而肮脏的代码,应该在别处声明 specialRow 等。在本例中,它被定义为 100 行中的第 50 行。
郑重声明,我不认为具有这样的重复功能是好的设计,但是,嘿,客户最清楚 :D
因此,客户的规范希望 UITableView 始终显示其中一行,以便用户可以在 UITableView 的任何位置与这个关键按钮进行交互。一旦他滚动并看到带有按钮的实际行,浮动页脚必须消失并允许用户与 'real' 单元格交互,而不是浮动版本。
我想出了以下代码:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if([self isPostularmeRowVisible])
{
[self hidePostularmeFooterView];
}
else
{
[self showPostularmeFooterView];
}
}
-(BOOL)isPostularmeRowVisible
{
NSArray *indexes = [self.tableView indexPathsForVisibleRows];
for (NSIndexPath *index in indexes)
{
if (index.row == 0 && index.section>=DetalleEmpleoPostularmeCell)
{
return YES;
}
}
return NO;
}
-(void) showPostularmeFooterView
{
NSAssert(_state==ESTADO_POSTULACION_NO_POSTULADO, @"NJDetalleEmpleoViewController: This shouldn't happen");
if(!self.footerView)
{
NJDetalleEmpleoPostularmeTableViewCell *footerView = [self.tableView dequeueReusableCellWithIdentifier:kDetalleEmpleoPostularmeCell];
[footerView configureCell:self.detaleAviso];
float h = self.view.frame.size.height-footerView.cellHeight;
footerView.frame = CGRectMake(0,h,self.view.frame.size.width,footerView.cellHeight);
footerView.delegate = self;
self.footerView = footerView;
[self.view addSubview:self.footerView];
[self.view bringSubviewToFront:self.footerView];
}
}
-(void) hidePostularmeFooterView
{
if(self.footerView)
{
[self.footerView removeFromSuperview];
}
self.footerView = nil;
}
但是这段代码有一个我似乎无法弄清楚的错误:一旦用户在 UITextBox 上点击并输入一些文本,它就会开始表现不稳定,即:屏幕上出现 2 个或更多单元格,当出现应该是none!基本上,当我调用方法 'hidePostularmeFooterView' 时,它似乎并没有消失(只有在我输入一些文本后,如果我不与之交互,它才能正常工作)。
在我输入一些文字后,似乎有两个版本的页脚,证据如下:
将其作为单元格和页脚删除并在 UITableView
下方将其替换为自己的 UIView
并让 UITableView
框架高度只下降到这个视图的 y 原点,而不是占据整个屏幕。这样您就可以随时看到视图并与之交互。有什么理由需要它成为 UITableViewCell
吗?
我不会碰 footerView,而是创建一个出现的自定义视图,如下所示:
dataSource = [NSMutableArray new];
for (int n = 0; n < 100; n++){
[dataSource addObject:[NSString stringWithFormat:@"%i",n]];
}
table = [UITableView new];
table.frame = self.view.bounds;
table.delegate = self;
table.dataSource = self;
[self.view addSubview:table];
popUpView = [UIImageView new];
popUpView.frame = CGRectMake(0, h-200, w, 200);
popUpView.image = [UIImage imageNamed:@"Grumpy-Cat.jpg"];
popUpView.contentMode = UIViewContentModeScaleAspectFill;
popUpView.clipsToBounds = true;
popUpView.layer.borderColor = [UIColor redColor].CGColor;
popUpView.layer.borderWidth = 2.0f;
[self.view addSubview:popUpView];
像往常一样设置 tableView,在 scrollViewDidScroll 方法中,你可以像这样粘贴:
NSIndexPath * specialRow = [NSIndexPath indexPathForRow:50 inSection:0];
NSArray * indices = table.indexPathsForVisibleRows;
if ([indices containsObject:specialRow]){
if (isShowing){
isShowing = false;
[UIView animateWithDuration:1.0f
delay:0.0f
usingSpringWithDamping:1.0f
initialSpringVelocity:0.8f
options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
animations:^{
popUpView.transform = CGAffineTransformMakeTranslation(0, popUpView.frame.size.height + 10);
}
completion:^(BOOL finished){
}];
}
} else if (!isShowing) {
isShowing = true;
[UIView animateWithDuration:1.0f
delay:0.0f
usingSpringWithDamping:1.0f
initialSpringVelocity:0.8f
options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
animations:^{
popUpView.transform = CGAffineTransformIdentity;
}
completion:^(BOOL finished){
}];
}
其中 isShowing 是一个跟踪 popUpView 状态的布尔值。这是快速而肮脏的代码,应该在别处声明 specialRow 等。在本例中,它被定义为 100 行中的第 50 行。
郑重声明,我不认为具有这样的重复功能是好的设计,但是,嘿,客户最清楚 :D