2014-01-28 55 views
12

我有单独的自定义UITableViewCell用于显示数据(这些数据来自服务器JSON响应)。在每个UITableViewCell我有按钮阅读more.If用户单击阅读更多按钮我想以编程方式添加UILabel显示其他信息从最初server.But我设定UITableViewCell高度,点击阅读更多的按钮,我不能能够看到更多的inforamtion UILabel以后。如何以编程方式增加iPhone中的UITableView单元格的高度?

这是屏幕截图:

enter image description here

这是我所需要的屏幕:

enter image description here

这是下面的代码,我用:

-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    int height1; 
    if(readMore){ 
     height1=200; 
     NSLog(@"Clicked"); 
    } 
    else{ 
     height1=100; 
     NSLog(@"Not clicked"); 
    } 
    return height1; // Normal height 
} 


-(NSInteger) tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section 
{ 
    return [TitleArr count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 
     static NSString *simpleTableIdentifier = @"SimpleTableCell_iPad"; 

     cell = (TableCell_Leads *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
    } 
    else{ 
     static NSString *simpleTableIdentifier = @"TableCell_Leads"; 

     cell = (TableCell_Leads *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
    } 
    if (cell == nil) 
    { 
     if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
     { 
      NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell_iPad" owner:self options:nil]; 
      cell = [nib objectAtIndex:0]; 

     } 
     else{ 
      NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TableCell_Leads" owner:self options:nil]; 
      cell = [nib objectAtIndex:0]; 
     } 
    } 




    cell.labTitle.text = [TitleArr objectAtIndex:indexPath.row]; 

    cell.labCategory.text=[CategoryArr objectAtIndex:indexPath.row]; 

    [cell.btnReadmore addTarget:self 
         action:@selector(funReadmore:) 
       forControlEvents:UIControlEventTouchUpInside]; 


    return cell; 
} 



- (IBAction)funReadmore:(id)sender 
    { 
     [self.tableView beginUpdates]; 
     readMore=TRUE; 



     NSLog(@"READ MORE"); 
     [self.tableView endUpdates]; 
} 
+0

请给我的建议..它是一个非常迫切的需求.. – Kalai

+1

看到我的示例项目.. –

回答

22

首先,采取bool & int变量。

BOOL isReadMoreButtonTouched = NO; 
int indexOfReadMoreButton = -1; 

然后用你的代码如下实施

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [[cell btnReadmore] setTag:[indexPath row]]; 

    if(isReadMoreButtonTouched && [indexPath row]== indexOfReadMoreButton) 
    { 
     // design your read more label here 
    } 
} 

现在实行IBAction为

-(IBAction) funReadmore:(id)sender 
{ 
    UIButton *readMoreButton = (UIButton *)sender; 
    indexOfReadMoreButton=[readMoreButton tag]; 
    isReadMoreButtonTouched=YES; 

    [[self tableView] beginUpdates]; 
    [[self tableView] reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForItem: indexOfReadMoreButton inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic]; 
    [[self tableView] endUpdates]; 
} 

现在来heightForRowAtIndexPath

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(isReadMoreButtonTouched && [indexPath row]== indexOfReadMoreButton) return 200.0f; 
    else return 100.0f; 
} 

希望它会为你工作。

+0

是谢谢你的yoursuggestions和我修改我的代码(如u张贴),但uitableview单元格高度没有改变 – Kalai

+0

我更新了我的ans在'funReadmore'方法尝试一次 –

+0

是的我更新..但它不工作:( – Kalai

1

你需要把某种标志的机制和管理高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

最好的和理想的方法是计算高度协议荷兰国际集团的文本,然后返回高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    if(readMore){ 
     return 500; 
    }else{ 
     return 100; 
    } 
} 

如果您正在使用自动布局,然后就可以计算出每个标签的大小手动根据内容通过sizeToFit方法

+0

我在哪里把这上面的代码行? – Kalai

+0

if(readmore)意思是?它表示什么? – Kalai

+1

如果readMore按钮被按下然后....这是一个标志BOOL –

4

乘坐int readMoreAtIndex;作为类变量。使用init method和/或viewDidLoad/viewWillAppear中的-1作为负值对其进行初始化。一些基本的逻辑是这样的:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(readMoreAtIndex == indexPath.row) { 
     return 400; //return as per your requirement 
    } 
    return 100; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    //same lines as currently you are doing to setup cell.  

    //important line 
    [cell.btnReadmore setTag:indexPath.row]; 

    [cell.btnReadmore addTarget:self 
         action:@selector(funReadmore:) 
       forControlEvents:UIControlEventTouchUpInside]; 

    if(indexPath.row == readMoreAtIndex) { 
     //setup your cell according to your logic to show expanded view 
    } 
    else { 
     //you are reusing cells, so provide logic to disappear shown expanded view if you want 
    } 

    return cell; 
} 

- (IBAction)funReadmore:(id)sender 
{  
    UIButton *button = (UIButton *)sender; 
    readMoreAtIndex = button.tag; 
    [yourTableView reloadData]; 
    NSLog(@"READ MORE"); 
} 

编辑:链接的教程来实现扩张/可折叠的tableview。

  1. Expanding/Collapsing TableView Sections
  2. Collapsable Table View for iOS
+0

对不起,我正在使用使用你的编码。它并没有给我的要求任何解决方案.. :( – Kalai

+0

没有我的uitableviewcell没有改变accroding根据我的要求.. – Kalai

+0

编辑您的问题和发布你如何显示扩大视图? –

1

我发布的示例代码将基于按钮单击展开单元格,文本大小适用于iOS6和iOS 7,这仅仅是示例代码,只是通过这个可能有助于您... :)

这只是一个示例项目,美国可以在customCell.m

0尝试


 in customCell.h 
    #import <UIKit/UIKit.h> 
    @class CustomCell; 
    @protocol ButtonClickDelegate <NSObject> //custom delegate 
    - (void)whenReadMoreButtonClicked:(CustomCell *)cell;//i am passing the cell itself 
    @end 

    @interface CustomCell : UITableViewCell 
    @property (nonatomic,assign)id<ButtonClickDelegate>delegate; 
    @property (nonatomic,retain)UILabel *mesageLabel; 
    @property (nonatomic,retain)NSString *message; 
    @property (nonatomic,assign)BOOL expand; 

    @end 



#import "CustomCell.h" 

    @implementation CustomCell 
    @synthesize delegate;//synthesize it 
    @synthesize mesageLabel; 
    @synthesize message; 
    @synthesize expand; 


    - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
    { 
     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
     if (self) { 
    // Initialization code 
     UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(5,2, 100, 35)]; 
     [button addTarget:self action:@selector(whenButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
     [button setTitle:@"Read More" forState:UIControlStateNormal]; 
     button.backgroundColor = [UIColor greenColor]; 

     self.mesageLabel = [[UILabel alloc]initWithFrame:CGRectMake(0 , 40,0 ,0)]; 
     self.mesageLabel.backgroundColor = [UIColor redColor]; 
     self.mesageLabel.numberOfLines = 100; 
     [self addSubview:self.mesageLabel]; 
     [self addSubview:button]; 
    } 
    return self; 
    } 

    - (void)setSelected:(BOOL)selected animated:(BOOL)animated 
    { 
     [super setSelected:selected animated:animated]; 

     // Configure the view for the selected state 
    } 

    - (void)whenButtonClicked:(id)sender 
    { 
     if([self.delegate respondsToSelector:@selector(whenReadMoreButtonClicked:)]) 
     { 
      [self.delegate whenReadMoreButtonClicked:self];//delegate to controller 
     } 

    } 

    - (void)layoutSubviews 
    { 
     [super layoutSubviews]; 
     self.mesageLabel.text = self.message; 
     if(self.expand) 
     { 
      CGSize size = [self findMessgeStringHeight]; 
      self.mesageLabel.frame = CGRectMake(0, 40, size.width, size.height); 
     } 
     else 
     { 
      self.mesageLabel.frame = CGRectMake(0, 40, self.bounds.size.width, 100); 
     } 

    } 


    //helper method to find height 
    - (CGSize)findMessgeStringHeight 
    { 
     NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:self.message attributes:@{ NSFontAttributeName:[UIFont systemFontOfSize:17.0f] }]; 
     CGRect rect = [attributedText boundingRectWithSize:(CGSize){225, MAXFLOAT} 
              options:NSStringDrawingUsesLineFragmentOrigin 
              context:nil]; 
     CGSize requiredSize = rect.size; 

     return requiredSize; //finally u return your height 
    } 

    @end 


中的viewController


 #import "ViewController.h" 
     #import "CustomCell.h" 

     @interface ViewController (<UITableViewDataSource,UITableViewDelegate,ButtonClickDelegate>//confirm's to delegate 
     { 

     BOOL ButtonClickedForExpand; 
     NSMutableArray *array; 

    } 

    @property (nonatomic,retain)NSIndexPath *previousIndexPath; 
     @property (nonatomic,retain)NSIndexPath *currentIndexPath; 

    @end 

    @implementation ViewController 
    @synthesize previousIndexPath; 
    @synthesize currentIndexPath; 

    - (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
     ButtonClickedForExpand = NO; 
// Do any additional setup after loading the view, typically from a nib. 
     array = [[NSMutableArray alloc]initWithObjects:@"hello happy coding some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext",@"some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext",@"ello happy coding some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext ello happy coding some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext ello happy coding some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext ello happy coding some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext ello happy coding some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtext some longtextsome longtext some longtext", nil]; 
     } 

    - (void)didReceiveMemoryWarning 
    { 
     [super didReceiveMemoryWarning]; 
     // Dispose of any resources that can be recreated. 
    } 

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    { 
     return 1; 
    } 

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    { 
     return array.count; 
    } 
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"]; 
    if(cell == nil) 
     { 
     cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"]; 
     } 

    if(ButtonClickedForExpand) 
    { 
     if(indexPath.row == currentIndexPath.row) 
     { 
      cell.expand = YES; 
     } 
     else 
     { 
      cell.expand = NO; 
     } 
    } 
    else 
    { 
     cell.expand = NO; 
    } 

    cell.message = [array objectAtIndex:indexPath.row]; 
    cell.delegate = self;//u need to set delegate to self 
    return cell; 
    } 

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     CGSize size = [self findMessgeStringHeight:[array objectAtIndex:indexPath.row]]; 
    if(ButtonClickedForExpand) 
     { 
     if(indexPath.row == currentIndexPath.row) 
     { 
      return size.height + 30; 
     } 
     else 
     { 
      return 100;//by default 
     } 
    } 
    else 
    { 
     return 100; 
    } 

    } 

    //helper function to return the correct height for your label 
    - (CGSize)findMessgeStringHeight:(NSString *)str 
    { 

    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:str attributes:@{ NSFontAttributeName:[UIFont systemFontOfSize:17.0f] }]; 
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){225, MAXFLOAT} 
              options:NSStringDrawingUsesLineFragmentOrigin 
              context:nil]; 
    CGSize requiredSize = rect.size; 

    return requiredSize; //finally u return your height 
    } 



    - (void)whenReadMoreButtonClicked:(CustomCell *)cell 
{ 
     ButtonClickedForExpand = YES; 
     self.previousIndexPath = self.currentIndexPath; 
     self.currentIndexPath = [self.tableView indexPathForCell:cell]; 


     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:self.currentIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 

    if(self.previousIndexPath.row == nil) 
    { 
     return; 
    } 
    else 
    { 
     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:self.previousIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     } 

    } 


    @end 


编辑:添加ButtonClickedForExpand为第一次点击

编辑:2在视图控制器

评论的“whenReadMoreButtonClicked”的方法改变if(self.previousIndexPath.row == nil)如果你不得到

1

我建议你遵循以下步骤:

在自定义单元格的内容是将可用于你,把它放在一个隐藏的UIView容器中。所以它默认是不可见的。

  1. 当更多按下按钮,手柄,吸引的tableView当你正在做它funReadmore处理程序类中的事件触发。

  2. 取对象的单元格索引并管理/添加它在NSMutableArray对象中。使用

  3. 刷新的TableView数据:

[yourTableViewInstance reloadData];
  1. heightForRowAtIndexPath委托功能,它这样写:
 
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(arrayOfExpandedCellIndexes.contains(indexPath.row))  
     return EXTENDED_CELL_HEIGHT; // Macro : #define EXTENDED_CELL_HEIGHT 230.0f 
    else 
     return NORMAL_CELL_HEIGHT;  // Macro : #define NORMAL_CELL_HEIGHT 100.0f 
} 

使用这种方式,您可以处理多个单元具有“阅读更多”按钮。如果你的要求只有一个单元可扩展您的明确使用arrayOfExpandedCellIndexes

[arrayOfExpandedCellIndexes removeAllObjects]; 

注:一旦高度调整为一电池,不要忘记,使隐藏的视图中可见。

希望它有帮助!

+0

这种方法在尝试扩展时并不适用于我单元格大小 – NSNoob

+0

@NSNoob,你可以告诉你那是什么?我已经使用这种方法,它工作正常。 – NeverHopeless

+0

我这样做是为了增加包含章节/书籍标题的单元格大小。 http://pastebin.com/HRfEpseg对第一个单元格(第一本书名称)工作正常。其余的,很好没有按计划进行 – NSNoob

2

我发现了另一个基于self-sizing表格视图单元的解决方案。我们可以更新约束优先级,而不是更新单元格的高度(硬编码)。

fileprivate extension Int { 
    static let rowHeight = 175 
} 

class CellArticleData { 
    var article: Article 
    var isExpanded: Bool 

    init(article: Article, isExpanded: Bool) { 
    self.article = article 
    self.isExpanded = isExpanded 
    } 
} 

enum Article: String { 
    case medicine, sport 
    static let allArticles: [Article] = [.medicine, .sport] 
    var title: String { return self.rawValue.capitalized } 
    var description: String { 
     switch self { 
      case .medicine: 
      return "Lorem Ipsum is simply dummy text of the printing and 
      typesetting industry" 
      case .sport: 
      return "Contrary to popular belief, Lorem Ipsum is not simply 
      random text. It has roots in a piece of classical Latin 
      literature from 45 BC, making it over 2000 years old. Richard 
      McClintock, a Latin professor at Hampden-Sydney College in 
      Virginia." 
     } 
    } 
} 

class ViewController: UIViewController { 

@IBOutlet weak var tableView: UITableView! 
var articles: [CellArticleData] = Article.allArticles.map { CellArticleData(article: $0, isExpanded: false) } 

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.dataSource = self 
    tableView.delegate = self 
    tableView.rowHeight = UITableViewAutomaticDimension 
    tableView.estimatedRowHeight = CGFloat(.rowHeight) 
} 

extension ViewController: UITableViewDataSource { 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MyCell 
    let articleData = articles[indexPath.row] 
    cell.setup(articleData: articleData) 
    cell.delegate = self 
    return cell 
    } 
} 

extension ViewController: MyCellDelegate { 

    func handleReadMore() { 
     tableView.reloadData() 
    } 
} 

我具有表示一个细胞“了myCell”,其处理协议和约束更新的自定义类:

protocol MyCellDelegate { 
    func handleReadMore() 
} 

class MyCell: UITableViewCell { 

    @IBOutlet weak var topConstraint: NSLayoutConstraint! 
    @IBOutlet weak var bottomConstraint: NSLayoutConstraint! 
    @IBOutlet weak var heightConstraint: NSLayoutConstraint! 

    func setup(articleData: CellArticleData) { 
    self.articleData = articleData 

    titleLabel.text = articleData.article.title 
    descriptionLabel.text = articleData.article.description 
    readMoreLabel.isUserInteractionEnabled = true 

    let readMoreTap = UITapGestureRecognizer(target: self, action: #selector(handleReadMore)) 
    readMoreTap.cancelsTouchesInView = false 
    readMoreLabel.addGestureRecognizer(readMoreTap) 
    updateCellConstraints() 
} 

fileprivate func updateCellConstraints() { 
    if let articleData = self.articleData { 
     if !articleData.isExpanded { 
      heightConstraint.priority = 999 
      topConstraint.priority = 250 
      bottomConstraint.priority = 250 
     }else { 
      heightConstraint.priority = 250 
      topConstraint.priority = 999 
      bottomConstraint.priority = 999 
     } 

    } 
    } 

    func handleReadMore() { 
     if let articleData = self.articleData { 
     articleData.isExpanded = !articleData.isExpanded 
     delegate?.handleReadMore(articleData: articleData) 
    } 
    } 
} 

这里是示出它的样子的一个示例: My custom cell MyCell

相关问题