为了澄清这个问题的目的:我知道如何使用子视图和使用drawRect创建复杂的视图.我试图完全理解何时使用一个而不是另一个.
我也明白,提前优化这一点是没有意义的,并且在进行任何分析之前做一些更难的方法.考虑到我对这两种方法感到满意,现在真的想要更深刻的理解.
我的很多困惑来自学习如何使表格视图滚动性能真正流畅和快速.当然,这种方法的原始来源是来自twitter for iPhone(以前的tweetie)的作者.基本上它说,为了使表格滚动黄油光滑,秘诀是不使用子视图,而是在一个自定义uiview中完成所有绘图.从本质上讲,使用大量子视图似乎会减慢渲染速度,因为它们有很多开销,并且经常在父视图上重新合成.
公平地说,这是在3GS是一个非常新的品牌时写的,iDevices从那以后变得更快.不过这种方法是经常 建议在interwebs和其他高性能表.事实上,它是Apple的表示例代码中的一种建议方法,已经在几个WWDC视频(iOS开发人员的实用绘图)和许多iOS 编程书籍中提出过.
甚至还有很棒的工具来设计图形并为它们生成Core Graphics代码.
所以起初我会相信"核心图形存在的原因.它很快!"
但是当我认为我得到"尽可能支持核心图形"的想法时,我开始看到drawRect经常导致应用程序响应能力差,内存非常昂贵,并且真正对CPU征税.基本上,我应该" 避免覆盖drawRect "(WWDC 2012 iOS App性能:图形和动画)
所以我想,就像一切一样,它很复杂.也许你可以帮助自己和其他人了解使用drawRect的时间和原因?
我看到一些使用Core Graphics的明显情况:
我看到避免Core Graphics的情况:
所以赐予你的知识.您在什么情况下可以使用drawRect/Core Graphics(也可以通过子视图完成)?哪些因素会导致您做出这个决定?如何/为什么在一个自定义视图中绘制建议用于黄油平滑表格单元格滚动,但Apple建议drawRect反对性能原因一般?那么简单的背景图像(你何时使用CG创建它们与使用可调整大小的png图像)?
制作有价值的应用程序可能不需要深入理解这个主题,但我不喜欢在不能解释原因的情况下在技术之间进行选择.我的大脑生我的气.
感谢大家的信息.这里有一些澄清问题:
在iOS7中,有一些新的API用于获取自动调整为用户在其首选项中设置的文本大小的字体.
它看起来像这样使用它:
UIFont *myFont = [UIFont fontWithDescriptor:[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size:0];
Run Code Online (Sandbox Code Playgroud)
现在,无论您为此分配的文本在用户更改其系统文本大小设置时都会以字体大小上下移动.(请记住收听name:UIContentSizeCategoryDidChangeNotification
通知并更新您的视图以考虑大小的变化).
我试图弄清楚如何使用自动布局(iOS6)和约束来做到这一点.
基本上我将我的大视图分为底部的两个部分.在这些部分(目前是子视图)内部,我有一个图像视图和一个标签.我希望以两边为中心,使用可变长度的文本.
我的头脑主要是围绕汽车布局,但我不确定最好的方法.我倾向于认为这在IB中是不可能的,但是在代码中.
继续尝试解决这个问题,但与此同时,我正在努力创建这个例子.
我在视图中有一个uilabel设置.它没有宽度约束,但其宽度由缩略图图像的前导约束和视图边缘的尾随约束决定.
标签设置为0行,并自动换行.我的理解是,这应该使uilabel的框架成长,有时它确实会发生.(在自动布局之前,我会计算并更新代码中标签的框架).
结果是,它在某些情况下可以正常工作,而在其他情况下则不然.看到大多数细胞在那里正常工作,但最后一个细胞看起来太大了.实际上它的尺寸合适.标题"Fair Oaks Smog Check Test"实际上以"Only"结尾.所以我对单元格大小的计算是正确的,它应该是那么大.但是,无论出于何种原因,标签都不会包装文本.它的框架宽度不会向右延伸,所以这不是问题.
那么这里发生了什么?它是100%一致的,总是在那个单元格而不是它上面的单元格,这让我认为它与文本的大小有关,并且一旦将该视图添加到单元格中,UILabel就不会重新布置文本(其中使它实际上更小的宽度).
有什么想法吗?
从我创建的一个样本单元计算单元格的高度,并将其存储在静态变量中:
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.items.count == 0) {
return 60;
}
static TCAnswerBuilderCell *cell = nil;
static dispatch_once_t pred;
dispatch_once(&pred,
^{
// get a sample cellonce
cell = [tableView dequeueReusableCellWithIdentifier:TC_ANSWER_BUILDER_CELL];
});
[cell configureCellWithThirdPartyObject:self.items[indexPath.row]];
return [cell heightForCellWithTableWidth:self.tableView.frame.size.width];
}
Run Code Online (Sandbox Code Playgroud)
我在运行中使用我的数据对象配置单元格,然后调用我在其上的方法,该方法计算具有给定表格宽度的单元格的高度(不能总是依赖于最初正确的单元格框架).
这反过来在我的视图上调用高度方法,因为它实际上是标签所在的位置:
- (CGFloat)heightForCellWithTableWidth:(CGFloat)tableWidth {
// subtract 38 from the constraint above
return [self.thirdPartyAnswerView heightForViewWithViewWidth:tableWidth - 38];
}
Run Code Online (Sandbox Code Playgroud)
此方法通过确定标签的正确宽度来确定高度,然后进行计算:
- (CGFloat)heightForViewWithViewWidth:(CGFloat)viewWidth {
CGFloat widthForCalc = viewWidth - self.imageFrameLeadingSpaceConstraint.constant …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用如下所示的约束构建titleView:
我知道如何用帧来做这件事.我会计算文本的宽度,图像的宽度,创建一个宽度/高度包含两者的视图,然后将两者作为子视图添加到具有框架的适当位置.
我试图理解如何通过约束来做到这一点.我的想法是内在的内容大小会帮助我在这里,但我正在疯狂地试图让这个工作.
UILabel *categoryNameLabel = [[UILabel alloc] init];
categoryNameLabel.text = categoryName; // a variable from elsewhere that has a category like "Popular"
categoryNameLabel.translatesAutoresizingMaskIntoConstraints = NO;
[categoryNameLabel sizeToFit]; // hoping to set it to the instrinsic size of the text?
UIView *titleView = [[UIView alloc] init]; // no frame here right?
[titleView addSubview:categoryNameLabel];
NSArray *constraints;
if (categoryImage) {
UIImageView *categoryImageView = [[UIImageView alloc] initWithImage:categoryImage];
[titleView addSubview:categoryImageView];
categoryImageView.translatesAutoresizingMaskIntoConstraints = NO;
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|[categoryImageView]-[categoryNameLabel]|" options:NSLayoutFormatAlignAllTop metrics:nil views:NSDictionaryOfVariableBindings(categoryImageView, categoryNameLabel)];
} else { …
Run Code Online (Sandbox Code Playgroud) 偶尔会在屏幕上的崩溃报告中看到这些弹出NSFetchedResultsController
,并且不确定如何解决它们.我不相信我在任何地方使用线程,除非NSFetchedResults
在内部使用它们.
'NSInternalInconsistencyException',原因:'语句仍处于活动状态'是我得到的完整解释.
两个最近的堆栈跟踪:
0 CoreFoundation 0x37a368bf __exceptionPreprocess + 163
1 libobjc.A.dylib 0x3151c1e5 objc_exception_throw + 33
2 CoreData 0x340b2ea5 -[NSSQLiteStatement cachedSQLiteStatement] + 1
3 CoreData 0x340b274f -[NSSQLiteConnection prepareSQLStatement:] + 55
4 CoreData 0x34156049 -[NSSQLChannel selectRowsWithCachedStatement:] + 61
5 CoreData 0x34181d63 newFetchedRowsForFetchPlan_MT + 783
6 CoreData 0x340bab07 -[NSSQLCore newRowsForFetchPlan:] + 351
7 CoreData 0x34160011 -[NSSQLCore fetchRowForObjectID:] + 1005
8 CoreData 0x340cca57 -[NSSQLCore newValuesForObjectWithID:withContext:error:] + 195
9 CoreData 0x340cbf83 _PFFaultHandlerLookupRow + 423
10 CoreData 0x340cba97 _PF_FulfillDeferredFault + 187 …
Run Code Online (Sandbox Code Playgroud) 我的问题基本上归结为在UITableCell中支持UILabel的动态高度(我想其他元素)的最佳方法,并且在旋转时也正确地调整标签宽度/高度和单元格高度.
我知道如何获得UILabels的预期高度,并相应地调整高度,但是当你支持横向时,事情似乎也变得非常棘手.
我认为这可能是layoutSubviews的路线,但我不确定如何将它与需要计算单元格高度的表结合起来.另一篇有趣的帖子在init上手动设置框架,以确保它们在已知数量的情况下进行计算,但这只能解决部分问题.
所以这是我正在处理的图像,红色箭头指向动态高度标签,蓝色箭头指向将改变高度的单元格.
我已经设法让它正常工作,但不确定它是否是正确的方法.
cellForRowAtIndexPath
始终以纵向模式显示其大小.(即,对于iPhone应用程序,它总是报告320).cellForRowAtIndexPath
正确的方向给出其大小[tableView reloadData]
轮换.我找不到任何其他方法来更新单元格和标签高度在viewDidLoad
我获取对每个标签字体的引用,以及与纵向中的tableView相比标签宽度百分比的浮点数
CWProductDetailDescriptionCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"DescriptionCell"];
self.descriptionLabelWidthPercentage = cell.descriptionLabel.frame.size.width / 320;
self.descriptionLabelFont = cell.descriptionLabel.font;
Run Code Online (Sandbox Code Playgroud)在heightForRowAtIndexPath
我使用tableView宽度和我已经抓住的百分比计算单元格高度:
case TableSectionDescription:
CGFloat labelWidth = self.tableView.frame.size.width * self.descriptionLabelWidthPercentage;
CGSize newLabelFrameSize = [self sizeForString:self.product.descriptionText WithConstraint:CGSizeMake(labelWidth, MAXFLOAT) AndFont:self.descriptionLabelFont];
return newLabelFrameSize.height + kTextCellPadding;
Run Code Online (Sandbox Code Playgroud)在cellForRowAtIndexPath
我计算标签框架的框架并更新它
cell = [tableView dequeueReusableCellWithIdentifier:@"DescriptionCell"];
((CWProductDetailDescriptionCell *)cell).descriptionLabel.text = …
Run Code Online (Sandbox Code Playgroud)因此,我在IB中设置了视图,使得此文本标签通过约束与缩略图的顶部对齐.
但是,正如我们所知,您无法在UILabel中垂直对齐文本.我的文本根据内容的长度更新字体大小.全尺寸文本看起来很棒,而视图上的小文本明显较低.
在现有的解决方案涉及任一呼叫sizeToFit或更新的UILabel的帧匹配的文本的高度.不幸的是,后者(尽管很难看)解决方案不能很好地解决你不应该更新框架的限制.当你需要让文本自动收缩直到它被截断时,前一个解决方案基本上不起作用.(因此它不适用于有限数量的行和自动收缩).
现在,为什么uilabel的内在尺寸(高度)不像宽度那样更新,当它被设置为它的自然尺寸时,通过"尺寸适合内容"超出了我.似乎它肯定应该,但事实并非如此.
所以我一直在寻找其他解决方案.据我所见,您可能需要在标签上设置高度约束,并在计算文本高度后调整高度常量.谁有一个很好的解决方案?
ember.js中的控制器是否意味着与iOS中的主视图区域/场景相关联,或者更多地与一组数据相关联?
在ember中将几个主要视图绑定到同一个控制器是否常见/明智?
在iOS中,屏幕的主要部分或部分绑定到单个控制器.如果您想要提供另一个主界面,比如创建一个新元素的模态窗口,您(通常)会有一个完全独立的控制器来管理该视图及其数据/逻辑.
在像Zend框架,你有可能执行确保认证一些常见的起转步骤控制器,但主要的操作播放控制器在iOS版的角色,处理逻辑,并提供了1个主段或视图中的数据(即网络,这通常最终成为整个页面).
在ember中使用控制器的典型角色或建议模式是什么?
ios ×9
autolayout ×3
iphone ×3
constraints ×1
core-data ×1
diagnostics ×1
ember.js ×1
ios7 ×1
memory ×1
objective-c ×1
uikit ×1