久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

UIScrollView 中的 UITableView 使用自動布局

UITableView within UIScrollView using autolayout(UIScrollView 中的 UITableView 使用自動布局)
本文介紹了UIScrollView 中的 UITableView 使用自動布局的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

目前,我正在使用 UITableView 以及 UIScrollView 中包含的其他視圖.我希望 UITableView 的高度與其內容高度相同.

為了使事情復雜化,我還插入/刪除行以提供手風琴效果,以便當用戶點擊一行時,它將顯示該行的更多詳細信息.

我已經完成了插入/刪除,但目前它沒有更新作為其父視圖的 UIScrollView,以便重新計算 UIScrollView 的內容大小和 UITableViewUIScrollView 中的其他視圖一起正確顯示.

當我更改 UITableView 的內容時,我該如何實現這一點,以便調整 UIScrollView 的大小并正確布局其內容?我目前正在使用自動布局.

解決方案

首先,那些其他視圖(table view 的兄弟姐妹)是否嚴格地在 table view 的上方和下方?如果是這樣,您是否考慮過讓表格視圖正常滾動,并將這些外部視圖放在表格視圖的頁眉和頁腳視圖中?那么你就不需要滾動視圖了.

其次,您可能需要閱讀

滾動視圖具有淺藍色背景.頂部的紅色標簽和底部的藍色標簽是滾動視圖中表格視圖的兄弟.

這是我測試中視圖控制器的完整源代碼.沒有xib文件.

#import "ViewController.h"#import "MyTableView.h"@interface ViewController() <UITableViewDataSource, UITableViewDelegate>@結尾@implementation 視圖控制器-(無效)加載視圖{UIView *view = [[UIView alloc] init];self.view = 視圖;UIScrollView *scrollView = [[UIScrollView alloc] init];scrollView.translatesAutoresizingMaskIntoConstraints = NO;scrollView.backgroundColor = [UIColor cyanColor];[查看 addSubview:scrollView];UILabel *topLabel = [[UILabel alloc] init];topLabel.translatesAutoresizingMaskIntoConstraints = NO;topLabel.text = @"頂部標簽";topLabel.backgroundColor = [UIColor redColor];[scrollView addSubview:topLabel];UILabel *bottomLabel = [[UILabel alloc] init];bottomLabel.translatesAutoresizingMaskIntoConstraints = NO;bottomLabel.text = @"底部標簽";bottomLabel.backgroundColor = [UIColor blueColor];[scrollView addSubview:bottomLabel];UITableView *tableView = [[MyTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];tableView.translatesAutoresizingMaskIntoConstraints = NO;tableView.dataSource = 自我;tableView.delegate = self;[scrollView addSubview:tableView];UILabel *footer = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 30)];footer.backgroundColor = [UIColor greenColor];footer.text = @"頁腳";tableView.tableFooterView = 頁腳;NSDictionary *views = NSDictionaryOfVariableBindings(scrollView, topLabel, bottomLabel, tableView);[查看添加約束:[NSLayoutConstraintconstraintsWithVisualFormat:@"V:|[scrollView]|"選項:0 指標:無意見:意見]];[查看添加約束:[NSLayoutConstraintconstraintsWithVisualFormat:@"H:|[scrollView]|"選項:0 指標:無意見:意見]];[查看添加約束:[NSLayoutConstraintconstraintsWithVisualFormat:@"V:|[topLabel][tableView][bottomLabel]|"選項:0 指標:無意見:意見]];[查看添加約束:[NSLayoutConstraintconstraintsWithVisualFormat:@"H:|[topLabel]|"選項:0 指標:無意見:意見]];[查看添加約束:[NSLayoutConstraintconstraintsWithVisualFormat:@"H:|-8-[tableView]-8-|"選項:0 指標:無意見:意見]];[查看添加約束:[NSLayoutConstraintconstraintWithItem:tableView 屬性:NSLayoutAttributeWidthrelatedBy:NSLayoutRelationEqualtoItem:視圖屬性:NSLayoutAttributeWidth乘數:1 常數:-16]];[查看添加約束:[NSLayoutConstraintconstraintsWithVisualFormat:@"H:|[bottomLabel]|"選項:0 指標:無意見:意見]];}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {返回 20;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];如果(!單元格){cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];}cell.textLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row];返回單元格;}@結尾

At the moment, I'm using a UITableView along with other views that are contained in a UIScrollView. I want the UITableView to have its height to be the same as its content height.

To complicate things, I'm also inserting / deleting rows to provide an accordion effect so that when the user taps on a row, it will show more detail for that row.

I've got the insert / deletion done, though at the moment it doesn't update the UIScrollView which is its superview so that the content size of the UIScrollView is recalculated and the UITableView along with other views in the UIScrollView are displayed correctly.

How can I go about implementing this so that UIScrollView's size is adjusted and its contents laid out correctly when I change the content of the UITableView? I'm currently using auto layout.

解決方案

First of all, are those other views (siblings of the table view) strictly above and below the table view? If so, have you considered letting the table view scroll normally, and putting those outside views in the table view's header and footer views? Then you don't need the scroll view.

Second, you may want to read Technical Note TN2154: UIScrollView And Autolayout if you haven't already.

Third, given the information in that tech note, I can think of a few ways to do what you want. The cleanest is probably to create a subclass of UITableView that implements the intrinsicContentSize method. The implementation is trivial:

@implementation MyTableView

- (CGSize)intrinsicContentSize {
    [self layoutIfNeeded]; // force my contentSize to be updated immediately
    return CGSizeMake(UIViewNoIntrinsicMetric, self.contentSize.height);
}

@end

Then just let auto layout use the table view's intrinsic content size. Create the constraints between the subviews of the scroll view (including the table view) to lay them out, and make sure there are constraints to all four edges of the scroll view.

You probably need to send invalidateIntrinsicContentSize to the table view at appropriate times (when you add or remove rows or change the heights of rows). You could probably just override the appropriate methods in MyTableView to do that. E.g. do [self invalidateIntrinsicContentSize] in -endUpdates, -reloadData, - insertRowsAtIndexPaths:withRowAnimation:, etc.

Here's the result of my testing:

The scroll view has the light blue background. The red top label and the blue bottom label are siblings of the table view inside the scroll view.

Here's the complete source code for the view controller in my test. There's no xib file.

#import "ViewController.h"
#import "MyTableView.h"

@interface ViewController () <UITableViewDataSource, UITableViewDelegate>

@end

@implementation ViewController

- (void)loadView {
    UIView *view = [[UIView alloc] init];
    self.view = view;

    UIScrollView *scrollView = [[UIScrollView alloc] init];
    scrollView.translatesAutoresizingMaskIntoConstraints = NO;
    scrollView.backgroundColor = [UIColor cyanColor];
    [view addSubview:scrollView];

    UILabel *topLabel = [[UILabel alloc] init];
    topLabel.translatesAutoresizingMaskIntoConstraints = NO;
    topLabel.text = @"Top Label";
    topLabel.backgroundColor = [UIColor redColor];
    [scrollView addSubview:topLabel];

    UILabel *bottomLabel = [[UILabel alloc] init];
    bottomLabel.translatesAutoresizingMaskIntoConstraints = NO;
    bottomLabel.text = @"Bottom Label";
    bottomLabel.backgroundColor = [UIColor blueColor];
    [scrollView addSubview:bottomLabel];

    UITableView *tableView = [[MyTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
    tableView.translatesAutoresizingMaskIntoConstraints = NO;
    tableView.dataSource = self;
    tableView.delegate = self;
    [scrollView addSubview:tableView];

    UILabel *footer = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 30)];
    footer.backgroundColor = [UIColor greenColor];
    footer.text = @"Footer";
    tableView.tableFooterView = footer;

    NSDictionary *views = NSDictionaryOfVariableBindings(
        scrollView, topLabel, bottomLabel, tableView);
    [view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:|[scrollView]|"
        options:0 metrics:nil views:views]];
    [view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"H:|[scrollView]|"
        options:0 metrics:nil views:views]];
    [view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:|[topLabel][tableView][bottomLabel]|"
        options:0 metrics:nil views:views]];
    [view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"H:|[topLabel]|"
        options:0 metrics:nil views:views]];
    [view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"H:|-8-[tableView]-8-|"
        options:0 metrics:nil views:views]];
    [view addConstraint:[NSLayoutConstraint
        constraintWithItem:tableView attribute:NSLayoutAttributeWidth
        relatedBy:NSLayoutRelationEqual
        toItem:view attribute:NSLayoutAttributeWidth
        multiplier:1 constant:-16]];
    [view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"H:|[bottomLabel]|"
        options:0 metrics:nil views:views]];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row];
    return cell;
}

@end

這篇關于UIScrollView 中的 UITableView 使用自動布局的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

How to subclass UIScrollView and make the delegate property private(如何繼承 UIScrollView 并使委托屬性私有)
Swift - how to get last taken 3 photos from photo library?(Swift - 如何從照片庫中獲取最后拍攝的 3 張照片?)
Setting contentOffset programmatically triggers scrollViewDidScroll(以編程方式設置 contentOffset 觸發 scrollViewDidScroll)
Photos app-like gap between pages in UIScrollView with pagingEnabled(使用 pagingEnabled 的 UIScrollView 中頁面之間的照片應用程序式間隙)
why UIScrollView is leaving space from top in ios 6 and ios 7(為什么 UIScrollView 在 ios 6 和 ios 7 中從頂部留下空間)
UIScrollView pauses NSTimer while scrolling(UIScrollView 在滾動時暫停 NSTimer)
主站蜘蛛池模板: 亚洲人高潮女人毛茸茸 | 国产乱码一区二区三区 | 五月婷婷开心 | 黄色一级片网站 | 日一日操一操 | 黑人黄色一级片 | 国产精品一品二区三区的使用体验 | 国产日韩欧美综合 | 欧美理论片在线观看 | 国产日韩欧美精品 | 日韩精品极品 | 欧洲精品一区二区三区 | 天天操女人 | 欧美日韩亚洲视频 | 四虎四虎 | 亚洲三级视频 | 性做久久久久久 | 免费黄色小网站 | 在线观看不卡av | 日韩和的一区二区 | 一级片在线免费观看 | 国内精品一区二区三区 | 亚洲h片 | 在线观看免费毛片 | 日韩中文视频 | 高潮毛片又色又爽免费 | 国产在线成人 | 亚洲一区二区在线视频 | 四虎com| 青青在线视频 | 日本综合久久 | 国产视频中文字幕 | 日本黄a三级三级三级 | 中文字幕+乱码+中文乱码91 | 亚洲永久精品视频 | 一级片免费网站 | 欧美精品一级片 | 日本免费中文字幕 | 国产在线一区二区三区 | 3d动漫精品h区xxxxx区 | 三级黄色 |