Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:表重新加载更改布局_Ios_Iphone_Uitableview_Animation_Collapse - Fatal编程技术网

iOS:表重新加载更改布局

iOS:表重新加载更改布局,ios,iphone,uitableview,animation,collapse,Ios,Iphone,Uitableview,Animation,Collapse,我有一个UI,它有一个UITableView和另一个视图。UITableView具有可折叠的部分,如下图所示。加载时,它看起来如下所示: 用户可以使用滑动手势展开右侧的灰色视图。我只是改变灰色视图的原点,并使用动画来实现这一点。那么它看起来是这样的: 但是,当我关闭UITableView的一部分时,UI似乎“重置”并恢复到其原始布局: 我希望在打开或关闭UITableView的某个部分时,灰色视图保持不变。我怎样才能做到这一点 my ViewController的代码如下所示: #impo

我有一个UI,它有一个UITableView和另一个视图。UITableView具有可折叠的部分,如下图所示。加载时,它看起来如下所示:

用户可以使用滑动手势展开右侧的灰色视图。我只是改变灰色视图的原点,并使用动画来实现这一点。那么它看起来是这样的:

但是,当我关闭UITableView的一部分时,UI似乎“重置”并恢复到其原始布局:

我希望在打开或关闭UITableView的某个部分时,灰色视图保持不变。我怎样才能做到这一点

my ViewController的代码如下所示:

#import "BooklistMaster.h"
#import "BooklistDetailViewController.h"
#import "Booklist.h"
#import "BooklistTitleCell.h"
#import "BooklistTitle.h"
#import "BooklistDetailHeaderView.h"
#import "BooklistDetailSectionInfo.h"
#import "BooklistDetailHandler.h"

static NSString *SectionHeaderViewIdentifier = @"SectionHeaderViewIdentifier";

@interface BooklistDetailViewController ()

@property (nonatomic) NSMutableArray *sectionInfoArray;
@property (nonatomic) NSIndexPath *pinchedIndexPath;
@property (nonatomic) NSInteger openSectionIndex;
@property (nonatomic) CGFloat initialPinchHeight;

@property (nonatomic) IBOutlet BooklistDetailHeaderView *sectionHeaderView;

// use the uniformRowHeight property if the pinch gesture should change all row heights simultaneously
@property (nonatomic) NSInteger uniformRowHeight;


@end

//#define DEFAULT_ROW_HEIGHT 88
#define HEADER_HEIGHT 48

@implementation BooklistDetailViewController

@synthesize listTitleLabel;
@synthesize backButton;
@synthesize booklistMaster;
@synthesize titleBarView;
@synthesize searchBar;
@synthesize tap;
@synthesize booklistId;
@synthesize booklistName;
@synthesize spinner;
@synthesize detailPaneFocused;
@synthesize detailView;
@synthesize swipeLeft;
@synthesize swipeRight;
@synthesize tableView;

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

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self.view sendSubviewToBack:tableView];
    detailPaneFocused=NO;
    listTitleLabel.text = booklistName;
    [spinner startAnimating];
    [spinner setHidden:NO];
     [titleBarView setBackgroundColor:[UIColor colorWithRed:.77647 green:.77647 blue:.79607 alpha:1]];

    tap = [[UITapGestureRecognizer alloc]
           initWithTarget:self
           action:@selector(dismissKeyboard)];
    [tap setCancelsTouchesInView:YES];

    swipeLeft = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(didSwipeLeft:)];
    [swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft];
    [detailView addGestureRecognizer:swipeLeft];

    swipeRight = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(didSwipeRight:)];
    [swipeRight setDirection:UISwipeGestureRecognizerDirectionRight];
    [detailView addGestureRecognizer:swipeRight];


    // Set up default values.
    self.tableView.sectionHeaderHeight = HEADER_HEIGHT;
    /*
     The section info array is thrown away in viewWillUnload, so it's OK to set the default values here. If you keep the section information etc. then set the default values in the designated initializer.
     */
   // self.uniformRowHeight = DEFAULT_ROW_HEIGHT;
    self.openSectionIndex = NSNotFound;

    UINib *sectionHeaderNib = [UINib nibWithNibName:@"BooklistDetailSectionHeaderView" bundle:nil];
    [self.tableView registerNib:sectionHeaderNib forHeaderFooterViewReuseIdentifier:SectionHeaderViewIdentifier];

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

    BooklistDetailHandler *handler = [[BooklistDetailHandler alloc] initForController:self];
    [handler getBooklistForId:booklistId];
}


-(void)didSwipeRight:(UISwipeGestureRecognizer *)recognizer{
    if (detailPaneFocused==YES) {
        detailPaneFocused=NO;
        [UIView animateWithDuration:.3
                         animations:^ {
                             CGRect newBounds = self.detailView.frame;
                             newBounds.origin.x += 200;
                             self.detailView.frame = newBounds;
                             [self.detailView layoutSubviews];


                         }];
    }
}

-(void)didSwipeLeft:(UISwipeGestureRecognizer *)recognizer{
    if (detailPaneFocused==NO) {
        detailPaneFocused=YES;
        [UIView animateWithDuration:.3
                         animations:^ {
                             CGRect newBounds = self.detailView.frame;
                             newBounds.origin.x -= 200;
                             self.detailView.frame = newBounds;
                             [self.detailView layoutSubviews];


                         }];
    }
}

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

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];


}
- (IBAction)buttonPressed:(id)sender {

    [[self navigationController]  popViewControllerAnimated:YES];
}

-(void)dismissKeyboard {
    [searchBar resignFirstResponder];
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [self dismissKeyboard];

}
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
    [self.view addGestureRecognizer:tap];

    [UIView animateWithDuration:.3
                     animations:^ {
                         CGRect newBounds = self.searchBar.frame;
                         newBounds.size.width += 200; //newBounds.size.width -= 215; to contract
                         newBounds.origin.x -= 200;
                         self.searchBar.frame = newBounds;
                         [self.searchBar layoutSubviews];
                     }];


}
-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{
    [self.view removeGestureRecognizer:tap];
    [UIView animateWithDuration:.3
                     animations:^ {
                         CGRect newBounds = self.searchBar.frame;
                         newBounds.size.width -= 200; //newBounds.size.width -= 215; to contract
                         newBounds.origin.x += 200;
                         self.searchBar.frame = newBounds;
                         [self.searchBar layoutSubviews];
                     }];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return booklistMaster.subLists.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
//    Booklist *list = [booklistMaster.subLists objectAtIndex:section];
//    return list.booklistTitles.count;

    BooklistDetailSectionInfo *sectionInfo = (self.sectionInfoArray)[section];
    NSInteger numStoriesInSection = sectionInfo.booklist.booklistTitles.count;

    return sectionInfo.open ? numStoriesInSection : 0;
}

//- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
//    
//    NSMutableArray *array = [[NSMutableArray alloc] init];
//    for (Booklist *list in booklistMaster.subLists) {
//        [array addObject:@"a"];
//    }
//    
//    return array;
//    
//}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    BooklistDetailHeaderView *sectionHeaderView = [self.tableView dequeueReusableHeaderFooterViewWithIdentifier:SectionHeaderViewIdentifier];

    BooklistDetailSectionInfo *sectionInfo = (self.sectionInfoArray)[section];
    sectionInfo.headerView = sectionHeaderView;

    sectionHeaderView.titleLabel.text = sectionInfo.booklist.listName;
    sectionHeaderView.section = section;
    sectionHeaderView.delegate = self;

    return sectionHeaderView;

}

//- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
//    
//}
//- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
//    
//  BooklistDetailSectionInfo *sectionInfo = (self.sectionInfoArray)[indexPath.section];
//    return [[sectionInfo objectInRowHeightsAtIndex:indexPath.row] floatValue];
//    // Alternatively, return rowHeight.
//}

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



    BooklistTitleCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BooklistTitleCell" forIndexPath:indexPath];

    Booklist *booklist = [booklistMaster.subLists objectAtIndex:indexPath.section];
    BooklistTitle *booklistTitle = [booklist.booklistTitles objectAtIndex:indexPath.row];
    cell.titleLabel.text=booklistTitle.title;

    return cell;
}

- (void)sectionHeaderView:(BooklistDetailHeaderView *)sectionHeaderView sectionOpened:(NSInteger)sectionOpened {

    BooklistDetailSectionInfo *sectionInfo = (self.sectionInfoArray)[sectionOpened];

    sectionInfo.open = YES;

    /*
     Create an array containing the index paths of the rows to insert: These correspond to the rows for each quotation in the current section.
     */
    NSInteger countOfRowsToInsert = sectionInfo.booklist.booklistTitles.count;
    NSMutableArray *indexPathsToInsert = [[NSMutableArray alloc] init];
    for (NSInteger i = 0; i < countOfRowsToInsert; i++) {
        [indexPathsToInsert addObject:[NSIndexPath indexPathForRow:i inSection:sectionOpened]];
    }

    /*
     Create an array containing the index paths of the rows to delete: These correspond to the rows for each quotation in the previously-open section, if there was one.
     */
    NSMutableArray *indexPathsToDelete = [[NSMutableArray alloc] init];

    NSInteger previousOpenSectionIndex = self.openSectionIndex;
    if (previousOpenSectionIndex != NSNotFound) {

        BooklistDetailSectionInfo *previousOpenSection = (self.sectionInfoArray)[previousOpenSectionIndex];
        previousOpenSection.open = NO;
        [previousOpenSection.headerView toggleOpenWithUserAction:NO];
        NSInteger countOfRowsToDelete = previousOpenSection.booklist.booklistTitles.count;
        for (NSInteger i = 0; i < countOfRowsToDelete; i++) {
            [indexPathsToDelete addObject:[NSIndexPath indexPathForRow:i inSection:previousOpenSectionIndex]];
        }
    }

    // style the animation so that there's a smooth flow in either direction
    UITableViewRowAnimation insertAnimation;
    UITableViewRowAnimation deleteAnimation;
    if (previousOpenSectionIndex == NSNotFound || sectionOpened < previousOpenSectionIndex) {
        insertAnimation = UITableViewRowAnimationTop;
        deleteAnimation = UITableViewRowAnimationBottom;
    }
    else {
        insertAnimation = UITableViewRowAnimationBottom;
        deleteAnimation = UITableViewRowAnimationTop;
    }

    // apply the updates
    [self.tableView beginUpdates];
    [self.tableView insertRowsAtIndexPaths:indexPathsToInsert withRowAnimation:insertAnimation];
    [self.tableView deleteRowsAtIndexPaths:indexPathsToDelete withRowAnimation:deleteAnimation];
    [self.tableView endUpdates];

    self.openSectionIndex = sectionOpened;
}

- (void)sectionHeaderView:(BooklistDetailHeaderView *)sectionHeaderView sectionClosed:(NSInteger)sectionClosed {

    /*
     Create an array of the index paths of the rows in the section that was closed, then delete those rows from the table view.
     */
    BooklistDetailSectionInfo *sectionInfo = (self.sectionInfoArray)[sectionClosed];

    sectionInfo.open = NO;
    NSInteger countOfRowsToDelete = [self.tableView numberOfRowsInSection:sectionClosed];

    if (countOfRowsToDelete > 0) {
        NSMutableArray *indexPathsToDelete = [[NSMutableArray alloc] init];
        for (NSInteger i = 0; i < countOfRowsToDelete; i++) {
            [indexPathsToDelete addObject:[NSIndexPath indexPathForRow:i inSection:sectionClosed]];
        }
        [self.tableView deleteRowsAtIndexPaths:indexPathsToDelete withRowAnimation:UITableViewRowAnimationTop];
    }
    self.openSectionIndex = NSNotFound;
}

-(void)setMasterBooklist:(BooklistMaster *)list{
    booklistMaster=list;
    /*
     Check whether the section info array has been created, and if so whether the section count still matches the current section count. In general, you need to keep the section info synchronized with the rows and section. If you support editing in the table view, you need to appropriately update the section info during editing operations.
     */
    if ((self.sectionInfoArray == nil) ||
        ([self.sectionInfoArray count] != [self numberOfSectionsInTableView:self.tableView])) {

        // For each play, set up a corresponding SectionInfo object to contain the default height for each row.
        NSMutableArray *infoArray = [[NSMutableArray alloc] init];

        for (Booklist *list in self.booklistMaster.subLists) {

            BooklistDetailSectionInfo *sectionInfo = [[BooklistDetailSectionInfo alloc] init];
            sectionInfo.booklist = list;
            sectionInfo.open = NO;

            // NSNumber *defaultRowHeight = @(DEFAULT_ROW_HEIGHT);
            NSInteger countOfTitles = sectionInfo.booklist.booklistTitles.count;
            for (NSInteger i = 0; i < countOfTitles; i++) {
                //[sectionInfo insertObject:defaultRowHeight inRowHeightsAtIndex:i];
            }

            [infoArray addObject:sectionInfo];
        }

        self.sectionInfoArray = infoArray;
    }
    [spinner stopAnimating];
    [spinner setHidden:YES];
    [self.tableView reloadData];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
//    if (detailPaneFocused==NO){
//        [self focusDetailPane];
//    }
}
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    if (detailPaneFocused==NO&&![indexPath isEqual:[tableView indexPathForSelectedRow]]){
        [self focusDetailPane];
    }
    return indexPath;
}

- (void)focusDetailPane{
    detailPaneFocused=YES;
    [UIView animateWithDuration:.3
                     animations:^ {
                         CGRect newBounds = self.detailView.frame;
                         newBounds.origin.x -= 200;
                         self.detailView.frame = newBounds;
                         [self.detailView layoutSubviews];

                     }];
}


@end
#导入“BooklistMaster.h”
#导入“BooklistDetailViewController.h”
#导入“Booklist.h”
#导入“BooklistTitleCell.h”
#导入“BooklistTitle.h”
#导入“BooklistDetailHeaderView.h”
#导入“BooklistDetailSectionInfo.h”
#导入“BooklistDetailHandler.h”
静态NSString*SectionHeaderServiceIdentifier=@“SectionHeaderServiceIdentifier”;
@接口BooklistDetailViewController()
@属性(非原子)NSMutableArray*sectionInfoArray;
@属性(非原子)NSIndexPath*pinchedIndexPath;
@属性(非原子)NSInteger openSectionIndex;
@性质(非原子)cGhHhHeight;
@属性(非原子)IBOutlet BooklistDetailHeaderView*sectionHeaderView;
//如果挤压手势应同时更改所有行高度,请使用uniformRowHeight属性
@属性(非原子)NSInteger UNIFORMROWHEIGH;
@结束
//#定义默认行高度88
#定义收割台高度48
@BooklistDetailViewController的实现
@合成标题标签;
@合成后按钮;
@综合书目管理员;
@综合标题栏视图;
@综合搜索栏;
@合成tap;
@合成书单;
@综合书目名称;
@合成纺纱机;
@合成聚苯胺;
@综合细节视图;
@合成swipeLeft;
@合成swipeRight;
@综合桌面视图;
-(id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
{
self=[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
如果(自我){
//自定义初始化
}
回归自我;
}
-(无效)viewDidLoad
{
[超级视图下载];
//加载视图后执行任何其他设置。
[self.view sendSubviewToBack:tableView];
detailPaneFocused=否;
listTitleLabel.text=booklistName;
[spinner startAnimating];
[微调器设置隐藏:否];
[标题栏视图setBackgroundColor:[UIColor COLOR WITH RED:.77647 green:.77647 blue:.79607 alpha:1];
点击=[[UITapGestureRecognitor alloc]
initWithTarget:self
操作:@选择器(键盘)];
[点击设置取消触摸视图:是];
swipeLeft=[[UISwipeGestureRecognitzer alloc]initWithTarget:self action:@selector(didSwipeLeft:)];
[swipeLeft设置方向:UISwipegestureRecognitizerDirectionLeft];
[detailView AddGestureRecognitor:swipeLeft];
swipeRight=[[UISwipegestureRecognitizer alloc]initWithTarget:self action:@selector(didSwipeRight:)];
[swipeRight设置方向:UISwipegestureRecognitizerDirectionRight];
[detailView AddGestureRecognitor:swipeRight];
//设置默认值。
self.tableView.sectionHeaderHeight=收割台高度;
/*
节信息数组在viewWillUnload中被丢弃,因此可以在此处设置默认值。如果保留节信息等,请在指定的初始值设定项中设置默认值。
*/
//self.uniformRowHeight=默认的行高;
self.openSectionIndex=NSNotFound;
UINib*sectionHeaderNib=[UINib-nibWithNibName:@“BookListDetailsSectionHeaderView”捆绑包:无];
[self.tableView注册表项nb:sectionheadernb-forheaderfooterviewereuseidentifier:sectionheadervieweridentifier];
self.tableView.tableFooterView=[[UIView alloc]initWithFrame:CGRectZero];
BooklistDetailHandler*handler=[[BooklistDetailHandler alloc]initForController:self];
[handler getBooklistForId:booklistId];
}
-(void)didSwipeRight:(UISwipegestureRecognitor*)识别器{
如果(detailPaneFocused==是){
detailPaneFocused=否;
[UIView animateWithDuration:.3
动画:^{
CGRect newBounds=self.detailView.frame;
新边界原点x+=200;
self.detailView.frame=新边界;
[self.detailView布局子视图];
}];
}
}
-(void)didSwipeLeft:(UISwipegestureRecognitor*)识别器{
如果(detailPaneFocused==否){
detailPaneFocused=是;
[UIView animateWithDuration:.3
动画:^{
CGRect newBounds=self.detailView.frame;
新边界原点x-=200;
self.detailView.frame=新边界;
[self.detailView布局子视图];
}];
}
}
-(无效)未收到记忆警告
{
[超级记忆警告];
//处置所有可以重新创建的资源。
}
-(无效)视图将显示:(BOOL)动画{
[超级视图将显示:动画];
}
-(iAction)按钮按下:(id)发件人{
[[self-navigationController]PopViewController初始化:是];
}
-(无效)解除键盘{
[搜索栏辞职FirstResponder];
}
-(无效)搜索栏搜索按钮选中:(UISearchBar*)搜索栏
{
[自毁键盘];
}
-(无效)searchBarTextDidBeginEditing:(UISearchBar*)搜索栏{
[self.view addgesturecognizer:tap];
[UIView animateWithDuration:.3
动画:^{
CGRect newBounds=self.searchBar.frame;
newBounds.size.width+=200;//newBounds.size.width-=215;合同
新边界原点x-=200;
self.searchBar.frame=newBounds;
[self.searchBar布局子视图];
}];