UITableView Header Override (UIView) 对滚动行为异常

Posted

技术标签:

【中文标题】UITableView Header Override (UIView) 对滚动行为异常【英文标题】:UITableView Header Override (UIView) behaving oddly to scrolling 【发布时间】:2012-12-26 20:42:07 【问题描述】:

我用一个通用的 UIView 覆盖(这是一个真实的词吗?无论如何)我的 UITableView 标头,以便在整个应用程序中使用。 它没什么大不了的,只是一个坚实的背景,预先选择的字体,字体大小,字体粗细,字体颜色等。这就是它的全部。实际上继承了 UIView

TableSectionView.h

#import <UIKit/UIKit.h>

@interface TableSectionView : UIView 
    NSString *textLabel;
    UIColor *textColor;
    UIColor *backgroundColor;
    BOOL bold;
    NSString *textFont;
    NSInteger textSize;



@property (nonatomic, retain) NSString *textLabel, *textFont;
@property (nonatomic, retain) UIColor *textColor, *backgroundColor;
@property (nonatomic) BOOL bold;
@property (nonatomic) NSInteger textSize;

- (id)initWithFrame:(CGRect)frame andText:(NSString*)text;

@end

TableSectionView.m

#import "TableSectionView.h"

@implementation TableSectionView

@synthesize textLabel, backgroundColor, textColor, bold, textFont, textSize;

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
    
    return self;


-(id)initWithFrame:(CGRect)frame andText:(NSString *)text 

    self = [self initWithFrame:frame];
    if(self) 

        textLabel = text;
        textFont = @"Arial-BoldMT";
        textSize = 16;
        textColor = [[UIColor alloc] initWithRed:1 green:1 blue:1 alpha:1];
        backgroundColor = [[UIColor alloc] initWithRed:0 green:0 blue:0 alpha:0.8];

    
    return self;



-(void)layoutSubviews 
    [super layoutSubviews];

    UILabel *title = [[UILabel alloc] initWithFrame:self.frame];

    title.text = [NSString stringWithFormat:@"  %@", textLabel];
    title.font = [UIFont fontWithName:textFont size:textSize];
    title.textColor = textColor;
    title.backgroundColor = backgroundColor;

    [self addSubview:title];



@end

以及我如何在文件中使用它:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
    return [[TableSectionView alloc] initWithFrame:CGRectZero andText:@"Table Section Title"];

这里没有什么奇怪或独特的。

这很有效,它显示得很好。当您滚动表格视图时会发生什么。 当您向上滚动时,部分标题会向下移动并停留在那里。速度越快,部分标题越向下移动并停留在那里,直到您回到表格顶部。 这个应用程序有大约 25 个单独的表视图,这个标题是分开的,我真的很想尽快解决这个渲染错误。

我想发布屏幕截图,但由于严格的保密协议,我不允许这样做,否则会有被解雇的风险。 但这里有一些东西可以可视化这个问题。我已经把所有的文字都弄模糊了,抱歉我别无选择:\

黑条是section header,图片顶部是UITableView的顶部。请注意该部分标题下降了多少,而不是它应该在哪里? (顶部,如普通部分标题)。我只是不知道在这里做什么

【问题讨论】:

你是否也覆盖了- (CGFloat)tableView:(UITableView *)_tableView heightForHeaderInSection:(NSInteger)section 不管有没有这个覆盖,它做的事情都是一样的,只是更高或更短,哈哈 每次使用 Arial,设计师都会杀死一只小猫... ;-) ;-) 【参考方案1】:

我认为你的问题在这里:

-(void)layoutSubviews 
    [super layoutSubviews];

    UILabel *title = [[UILabel alloc] initWithFrame:self.frame];

    title.text = [NSString stringWithFormat:@"  %@", textLabel];
    title.font = [UIFont fontWithName:textFont size:textSize];
    title.textColor = textColor;
    title.backgroundColor = backgroundColor;

    [self addSubview:title];


在 layoutSubviews 中添加子视图很奇怪。为什么不在 initWithFrame 中做,以免混淆 Cocoa 的渲染代码?

编辑:这也使您免于保存所有这些成员变量、声明所有这些属性并合成它们:)

编辑 2:当您初始化 UILabel 时,您也应该使用 self.bounds 而不是 self.frame 作为参考。

【讨论】:

实际上,只需将.frame 切换为.bounds 就可以创造奇迹!我希望属性可以修改(以防万一需要),这就是我这样做的原因。但无论哪种方式,固定!太棒了,谢谢你:)

以上是关于UITableView Header Override (UIView) 对滚动行为异常的主要内容,如果未能解决你的问题,请参考以下文章

如何自定义UITableView的Header

UITableView section header 不固定

UIScrollView 内的 UITableView 或使用 TableView Header

在 UITableview 部分的 Header 视图中从 UIButton 检索部分

在 UITableView 中为 Section Header 添加填充

UITableview Header 隐藏顶部单元格