我在使用自动布局尝试实现一些非常基本的布局行为时遇到了麻烦.我的视图控制器在IB中看起来像这样:
顶部标签是标题标签,我不知道它会有多少行.我需要标题标签来显示所有文本行.我还需要另外两个标签和小图像放在标题正下方,不管它有多高.我在标签和小图像之间设置了垂直间距约束,在标题标签和超视图之间设置了顶部间距约束,在小图像和超级视图之间设置了底部间距约束.白色UIView没有高度约束,因此它应该垂直拉伸以包含其子视图.我已将标题标签的行数设置为0.
如何调整标题标签以适应字符串所需的行数?我的理解是我不能使用setFrame方法,因为我正在使用自动布局.我必须使用自动布局,因为我需要那些其他视图保持在标题标签下面(因此约束).
我怎样才能做到这一点?
我对自动布局的理解是,它采用超视图的大小,并以约束和内在大小为基础计算子视图的位置.
有没有办法扭转这个过程?我想在约束和内在大小的基础上调整superview的大小.实现这一目标的最简单方法是什么?
我有在Xcode中设计的视图,我用它作为标题UITableView
.该视图包括标签和按钮.标签的大小因数据而异.根据约束条件,标签成功按下按钮,或者如果按钮和superview底部之间存在约束,则标签将被压缩.
我找到了一些类似的问题,但他们没有很好的答案.
因为我发现AutoLayout
我到处都使用它,现在我正在尝试使用它tableHeaderView
.
我做了subclass
一些UIView
添加的东西(标签等......)我想要他们的约束,然后我把它添加CustomView
到UITableView
' tableHeaderView
.
一切都工作得很好,除了UITableView
总是显示上面的CustomView
,通过以上我指的CustomView
是下的UITableView
,因此它不能被看到!
看来,无论我做什么,对height
的UITableView
" tableHeaderView
是始终 0(所以是宽度,x和y).
我的问题:如果不手动设置框架,是否可以完成此操作?
编辑:我正在使用
的CustomView
' subview
有这些限制:
_title = [[UILabel alloc]init];
_title.text = @"Title";
[self addSubview:_title];
[_title keep:[KeepTopInset rules:@[[KeepEqual must:5]]]]; // title has to stay at least 5 away from the supperview Top
[_title keep:[KeepRightInset …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的uiTableView创建一个标题视图(不是节标题,我已经有了.)我在界面构建器中设置了一个XIB.所有的连接都连接起来,它运行得很漂亮......除了桌子没有足够的空间!我的问题是表的顶部稍微重叠了表的标题.
我的XIB设置为所有按钮的自动布局,IB很高兴约束不会发生冲突/模糊.视图设置为自由形式大小,在我的情况下最终为320 x 471.然后在视图的约束中,我为视图设置了内在大小.
现在这与我的桌子完美搭配.一切看起来都很棒.但是如果我用代码手动更改标题视图中的任何字体,布局会使视图变大,最终会在我的表格下面.
任何想法如何让tableviewcontroller在设置字体和大小后留下足够的空间用于标题视图?我希望我有理由解释这一点.
关于正确调整带有自动布局的tableHeaderView(一个这样的线程)有很多线程,但它们倾向于预先设置iOS 8.
我有一个有很多表视图的情况,都有标题,在iOS 7下正确大小但在iOS 8下使用大多数上述线程支持的代码不正确.在表的控制器中,我有以下方法:
- (void)rejiggerTableHeaderView
{
self.tableView.tableHeaderView = nil;
UIView *header = self.headerView;
[header setNeedsLayout];
[header layoutIfNeeded];
CGFloat height = [header systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect headerFrame = header.frame;
headerFrame.size.height = height;
header.frame = headerFrame;
self.tableView.tableHeaderView = header;
}
Run Code Online (Sandbox Code Playgroud)
使用iOS 7下的多行标签,这样可以正确调整表格视图的标题大小,如下所示:
但是在iOS 8下运行的相同代码会产生以下结果:
获取-systemLayoutSizeFittingSize的技巧是什么:在iOS 8下返回正确的大小?这是一个演示该问题的示例项目.
我的应用程序创建了一个UITableViewController,它包含一个可能具有任意高度的自定义tableHeaderView.我一直在努力设置动态设置此标头,因为似乎建议的方法是缩短此标头.我的UITableViewController的相关代码:
import UIKit
import SafariServices
class RedditPostViewController: UITableViewController, NetworkCommunication, SubViewLaunchLinkManager {
//MARK: UITableViewDataSource
var post: PostData?
var tree: CommentTree?
weak var session: Session! = Session.sharedInstance
override func viewDidLoad() {
super.viewDidLoad()
// Get post info from api
guard let postData = post else { return }
//Configure comment table
self.tableView.registerClass(RedditPostCommentTableViewCell.self, forCellReuseIdentifier: "CommentCell")
let tableHeader = PostView(withPost: postData, inViewController: self)
let size = tableHeader.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize)
let height = size.height
let width = size.width
tableHeader.frame = CGRectMake(0, 0, width, height)
self.tableView.tableHeaderView = tableHeader
session.getRedditPost(postData) …
Run Code Online (Sandbox Code Playgroud) 我有一个UIView
包含多行的子类UILabel
.此视图使用autolayout.
我想设置该视图为tableHeaderView
的UITableView
(不是一节头).此标题的高度取决于标签的文本,而标签的文本又取决于设备的宽度.那种场景自动布局应该很棒.
我发现并尝试了 许多 解决方案来实现这一点,但无济于事.我试过的一些事情:
preferredMaxLayoutWidth
在期间为每个标签设置一个layoutSubviews
intrinsicContentSize
tableHeaderView
手动设置框架.我遇到的一些各种失败:
Auto Layout still required after executing -layoutSubviews
解决方案(或解决方案,如有必要)应适用于iOS 7和iOS 8.请注意,所有这些都是以编程方式完成的.我已经设置了一个小型示例项目,以防您想要查看问题.我已将我的努力重置到以下起点:
SCAMessageView *header = [[SCAMessageView alloc] init];
header.titleLabel.text = @"Warning";
header.subtitleLabel.text = @"This is a message with enough text to span multiple lines. This text is set at runtime and might be short or long.";
self.tableView.tableHeaderView = header; …
Run Code Online (Sandbox Code Playgroud) 我已向Apple提交了有关此问题的错误报告!
我正在尝试在我的UITableViewHeader上使用新的iOS 6 Auto Layout,但是我抛出的所有东西都会在帖子结尾处返回错误.
我的代码:
TBMTableViewController.h
#import <UIKit/UIKit.h>
@interface TBMTableViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@end
Run Code Online (Sandbox Code Playgroud)
TBMTableViewController.m
#import "TBMTableViewController.h"
#import "UIView+Constraint.h"
@implementation TBMTableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
UITableViewController *tableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
[tableViewController.tableView setTranslatesAutoresizingMaskIntoConstraints:NO];
UITableView *tableView = tableViewController.tableView;
[tableView setTranslatesAutoresizingMaskIntoConstraints:NO];
[tableView setDelegate:self];
[tableView setDataSource:self];
[self.view addSubview:tableView];
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200.0f)];
[headerView setTranslatesAutoresizingMaskIntoConstraints:NO];
[tableView setTableHeaderView:headerView];
UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn1 setTranslatesAutoresizingMaskIntoConstraints:NO];
[btn1 setTitle:@"Button 1" forState:UIControlStateNormal];
[btn1 sizeToFit];
[headerView addSubview:btn1];
UIButton *btn2 = [UIButton …
Run Code Online (Sandbox Code Playgroud) 我知道有很多关于它的帖子,但也许在最新的iOS上有一些更新...
我认为我们所有人都有一项创建任务,viewController
其中包含大量内容,其中大部分内容都是自我调整的,而最底层则表明你需要展示一些tableView
包含很多内容的内容......
可以做的第一个解决方案是使用UIScrollView
,而根本不关心reusableCells.
所述第二是使用UITableView
的headerView
并手动调整其高度(或通过调用systemLayoutSizeFittingSize:
在需要时)各一次.
也许第三解决方案是使用UITableView
和自我尺寸UIView
分别与具有UIEdgeInsets
上tableView
.并根据什么物体上具有较高的"zIndex的",它可以带来与处理的交互问题......
的规定解决方案是使用电池上面全部内容,就像一个独立的单元.根本不确定这是个好主意......
问题:这个问题有新的解决方案吗?我没有深入研究它2年......也许在新的iOS中有类似reusableViews的东西UIScrollView
...当然,目标是拥有可重复使用的单元格,并使用自动布局标题而无需手动更新其高度...
大家好我有一个TableHeaderView,一切都由Autolayout管理:
的UIImageView
在顶部应始终为2:1,所以我设置纵横比和所需约束的其余部分.
4 UIButtons
应该始终是水平的,并且应该具有相同的高度和宽度.所以我使用Equal Width和Equal Height,并且纵横比为1:1
和我有两个UILabels
与numberOfLines
设置为0.我也把我的子类UILabel
,因为preferredMaxLayoutWidth
,这样的:
- (void) layoutSubviews
{
[super layoutSubviews];
if ( self.numberOfLines == 0 )
{
if ( self.preferredMaxLayoutWidth != self.frame.size.width )
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[self setNeedsUpdateConstraints];
}
}
}
Run Code Online (Sandbox Code Playgroud)这是我的代码:
- (void)initializeHeaderViewLabels
{
//After the Response from my server arrived i set the tableHeaderView with the Textdata
self.tableView.tableHeaderView = nil;
if((self.contentDict[@"title"]) != [NSNull null])
{
self.headerTitleLabel.text = (self.contentDict[@"title"]);
}
if((self.contentDict[@"shortDescription"]) != [NSNull null]) …
Run Code Online (Sandbox Code Playgroud) ios ×10
uitableview ×8
autolayout ×7
objective-c ×4
iphone ×2
cocoa-touch ×1
ipad ×1
swift ×1
uilabel ×1
uiscrollview ×1
uiview ×1