IOS自动调整表格单元格大小。扩展弹出菜单(如tweetbot)

时间:2014-01-02 19:58:41

标签: ios uitableview accordion expand autoresize

我知道这可能是一个令人头痛的问题,但需要做。我终于得到了我的tableview调整单元格以及我的标签,使得每个单元格中的所有文本都能正确显示。

注意:评论&amp;凹凸按钮不是我想要在单元格展开时显示的弹出菜单,应始终显示这两个按钮,我要添加的菜单将是一组4个按钮,当单元格展开时,这些按钮将显示在这些按钮下面< / p>

enter image description here

enter image description here

enter image description here

但是现在我想为每个单元格添加一个弹出菜单,如tweetbot,如下所示

enter image description here

但由于我使用autolayout约束调整标签的大小,这被证明是相当困难的。我遇到了这个如何在github here上实现类似于Tweetbot的东西的例子,这看似非常简单实用。

问题在于此示例假设所有单元格大小相同,并且它们没有动态调整单个单元格。

PublicFeedViewController.M

#import "PublicFeedViewController.h"
#import "FeedItemCell.h"
#import "AFNetworking.h"
#import "UIImageView+WebCache.h"
#import "InboxDetailViewController.h"
#import "SWRevealViewController.h"
#import "CommentsViewController.h"
#import "NSDate+TimeAgo.h"


@interface PublicFeedViewController (){
    NSArray *NameLabel;
    NSArray *StatusLabel;
    NSMutableArray *feedArray;
}

@end

@implementation PublicFeedViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    //The below code prompts the user for push notifications. If allowed, code in AppDelegate takes over and stores the token.
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
 // Do any additional setup after loading the view.
    self.FeedTable.dataSource=self;
    self.FeedTable.delegate=self;

    // Set the side bar button action. When it's tapped, it'll show up the sidebar.
    _sidebarButton.target = self.revealViewController;
    _sidebarButton.action = @selector(revealToggle:);

    // Set the gesture
    [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    NSDictionary *parameters = @{@"foo": @"bar"};
    [UIApplication sharedApplication].networkActivityIndicatorVisible = TRUE;
    [manager POST:@"http://" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        //NSLog(@"JSON: %@", responseObject);

        self->feedArray = [responseObject objectForKey:@"feed"];

        [self.FeedTable reloadData];
        [UIApplication sharedApplication].networkActivityIndicatorVisible = FALSE;
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];


}

- (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 feedArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{


    NSString *CellIdentifier=@"Cell";

    FeedItemCell *Cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(!Cell){
        Cell = [[FeedItemCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    }


    NSLog(@"FEED ARRAY: %@", self->feedArray);
    NSDictionary *tempDictionary= [self->feedArray objectAtIndex:indexPath.row];
    // Display recipe in the table cell
    NSString *thumb_img = [tempDictionary objectForKey:@"thumb_img"];
    NSString *thumb_path=@"http://";
    NSString *thumb_url = [thumb_path stringByAppendingString:thumb_img];



    Cell.NameLabel.text=[tempDictionary objectForKey:@"first_name"];




    Cell.StatusLabel.text=[tempDictionary objectForKey:@"message"];
    Cell.msg_id=[tempDictionary objectForKey:@"msg_id"];
    //Cell.status=[tempDictionary objectForKey:@"message"];
    Cell.StatusLabel.lineBreakMode=0;
    Cell.StatusLabel.numberOfLines=0;
    NSString *commentCount = [tempDictionary objectForKey:@"comment_count"];
    NSString *commentButtonText =[NSString stringWithFormat:@"Comments ( %@ )",commentCount];
    [Cell.commentButton setTitle:commentButtonText  forState: UIControlStateNormal];
    NSString *bumpCount = [tempDictionary objectForKey:@"bump_count"];
    NSString *bumpButtonText =[NSString stringWithFormat:@"Bumps ( %@ )",bumpCount];
    [Cell.bumpButton setTitle:bumpButtonText  forState: UIControlStateNormal];
    //[Cell.StatusLabel sizeToFit];
    NSString *created_string=[tempDictionary objectForKey:@"created"];
    double created_double = created_string.doubleValue;
    NSDate *date = [[NSDate alloc] initWithTimeIntervalSince1970:created_double];
    NSString *ago = [date timeAgo];
    Cell.timeLabel.text=ago;




    //Cell.DefaultImg.image = [UIImage imageNamed:@"buhz_mini_logo.png"];

    [Cell.DefaultImg setImageWithURL:[NSURL URLWithString:thumb_url]
                    placeholderImage:[UIImage imageNamed:@".png"]];
    return Cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //Ideally you should do lazy loading so that instead of creating a new textView each time, you just reuse the same one.
    UITextView *temp = [[UITextView alloc] initWithFrame:CGRectMake(82, 26, self.FeedTable.frame.size.width, 18)]; //This initial size doesn't matter
    NSDictionary *tempDictionary= [self->feedArray objectAtIndex:indexPath.row];
    NSString *status = [tempDictionary objectForKey:@"message"];
    temp.font =[UIFont fontWithName:@"System" size:12];
    temp.text = status;
    [temp isHidden];

    CGFloat textViewWidth = 218;
    CGRect tempFrame = CGRectMake(82,26,textViewWidth,18); //The height of this frame doesn't matter.
    CGSize tvsize = [temp sizeThatFits:CGSizeMake(tempFrame.size.width, tempFrame.size.height)]; //This calculates the necessary size so that all the text fits in the necessary width.

    //Add the height of the other UI elements inside your cell

    return tvsize.height + 70;


}

@end

CUSTOM FeedItemCell.M

#import "FeedItemCell.h"
#import "WYPopoverController/WYPopoverController.h"
#import "WYPopoverController/WYStoryboardPopoverSegue.h"
#import "CommentsViewController.h"
#import "NSDate+TimeAgo.h"


@interface FeedItemCell() <WYPopoverControllerDelegate>
{

    WYPopoverController* commentsPopoverController;
}
- (IBAction)open:(id)sender;
- (void)close:(id)sender;
@end


@implementation FeedItemCell
@synthesize commentButton;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}




-(IBAction)bump:(id)sender{

    [self expand];

}

- (IBAction)open:(id)sender
{
    [self showpopover:sender];
}

- (void)close:(id)sender
{
    [commentsPopoverController dismissPopoverAnimated:YES];
    commentsPopoverController.delegate = nil;
    commentsPopoverController = nil;
}

-(void)expand
{
    CGRect  oldFrame = [self frame];

    [self setFrame:CGRectMake(  oldFrame.origin.x,
                              oldFrame.origin.y,
                              oldFrame.size.width,
                              oldFrame.size.height * 2)];
}




-(void)contract
{
    CGRect  oldFrame = [self frame];

    [self setFrame:CGRectMake(  oldFrame.origin.x,
                              oldFrame.origin.y,
                              oldFrame.size.width,
                              oldFrame.size.height / 2)];
}


- (IBAction)showpopover:(id)sender
{
    if (commentsPopoverController == nil)
    {
        UIView *btn = (UIView*)sender;
         UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        CommentsViewController *commentsViewController = [storyboard instantiateViewControllerWithIdentifier:@"Comments"];
        commentsViewController.msg_id=_msg_id;


        if ([commentsViewController respondsToSelector:@selector(setPreferredContentSize:)]) {
            commentsViewController.preferredContentSize = CGSizeMake(300, 500);             // iOS 7
        }
        else {
            commentsViewController.contentSizeForViewInPopover = CGSizeMake(300, 500);      // iOS < 7
        }


        commentsViewController.title = @"Comments";
        [commentsViewController.navigationItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(close:)]];

        commentsViewController.modalInPopover = NO;

        UINavigationController* contentViewController = [[UINavigationController alloc] initWithRootViewController:commentsViewController];

        commentsPopoverController = [[WYPopoverController alloc] initWithContentViewController:contentViewController];
        commentsPopoverController.delegate = self;
        commentsPopoverController.passthroughViews = @[btn];
        commentsPopoverController.popoverLayoutMargins = UIEdgeInsetsMake(10, 10, 10, 10);
        commentsPopoverController.wantsDefaultContentAppearance = NO;

        [commentsPopoverController presentPopoverFromRect:btn.bounds
                                                   inView:btn
                                 permittedArrowDirections:WYPopoverArrowDirectionNone
                                                 animated:YES
                                                  options:WYPopoverAnimationOptionFadeWithScale];


    }


    else
    {
        [self close:nil];
    }
}
- (BOOL)popoverControllerShouldDismissPopover:(WYPopoverController *)controller
{
    return YES;
}

- (void)popoverControllerDidDismissPopover:(WYPopoverController *)controller
{
    if (controller == commentsPopoverController)
    {
        commentsPopoverController.delegate = nil;
        commentsPopoverController = nil;
    }
}



@end

0 个答案:

没有答案