小编Bob*_*ryn的帖子

drawRect或不绘制drawRect(何时应该使用drawRect/Core Graphics vs subviews/images以及为什么?)

为了澄清这个问题的目的:我知道如何使用子视图和使用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的明显情况:

  1. 你有动态数据(Apple的股票图表示例)
  2. 您有一个灵活的UI元素,无法使用简单的可调整大小的图像执行
  3. 您正在创建动态图形,一旦渲染在多个位置使用

我看到避免Core Graphics的情况:

  1. 视图的属性需要单独设置动画
  2. 你有一个相对较小的视图层次结构,因此任何使用CG的额外努力都不值得获得
  3. 您想要更新视图的各个部分而不重绘整个视图
  4. 父视图大小更改时,子视图的布局需要更新

所以赐予你的知识.您在什么情况下可以使用drawRect/Core Graphics(也可以通过子视图完成)?哪些因素会导致您做出这个决定?如何/为什么在一个自定义视图中绘制建议用于黄油平滑表格单元格滚动,但Apple建议drawRect反对性能原因一般?那么简单的背景图像(你何时使用CG创建它们与使用可调整大小的png图像)?

制作有价值的应用程序可能不需要深入理解这个主题,但我不喜欢在不能解释原因的情况下在技术之间进行选择.我的大脑生我的气.

问题更新

感谢大家的信息.这里有一些澄清问题:

  1. 如果你正在绘制具有核心图形的东西,但是可以用UIImageViews和预渲染的png完成同样的事情,你应该总是走这条路吗?
  2. 一个类似的问题:特别是像这样的badass工具,你何时应该考虑在核心图形中绘制界面元素?(可能是元素的显示是可变的.例如,具有20种不同颜色变化的按钮.还有其他情况吗?)
  3. 根据我在下面的回答中的理解,通过在复杂的UIView渲染自身后有效捕获单元格的快照位图,并在滚动和隐藏复杂视图时显示,可以获得表格单元格相同的性能提升吗?显然有些部分必须要制定出来.我有一个有趣的想法.

iphone core-graphics ios

139
推荐指数
4
解决办法
2万
查看次数

如何在iOS7中使用具有动态文本大小的自定义字体

在iOS7中,有一些新的API用于获取自动调整为用户在其首选项中设置的文本大小的字体.

它看起来像这样使用它:

UIFont *myFont = [UIFont fontWithDescriptor:[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size:0];
Run Code Online (Sandbox Code Playgroud)

现在,无论您为此分配的文本在用户更改其系统文本大小设置时都会以字体大小上下移动.(请记住收听name:UIContentSizeCategoryDidChangeNotification通知并更新您的视图以考虑大小的变化).

如何使用默认Helvetica-Neue以外的字体使用动态文本?

ios ios7

86
推荐指数
6
解决办法
3万
查看次数

自动布局(约束)中心2在父视图中并排显示

我试图弄清楚如何使用自动布局(iOS6)和约束来做到这一点.

基本上我将我的大视图分为底部的两个部分.在这些部分(目前是子视图)内部,我有一个图像视图和一个标签.我希望以两边为中心,使用可变长度的文本.

我的头脑主要是围绕汽车布局,但我不确定最好的方法.我倾向于认为这在IB中是不可能的,但是在代码中.

继续尝试解决这个问题,但与此同时,我正在努力创建这个例子.

在此输入图像描述

iphone constraints ios autolayout

69
推荐指数
6
解决办法
6万
查看次数

UILabel有时无法正确包装文本(自动布局)

我在视图中有一个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)

ios autolayout

40
推荐指数
2
解决办法
3万
查看次数

使用约束以编程方式构建titleView(或者通常使用约束构建视图)

我正在尝试使用如下所示的约束构建titleView:

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)

ios nslayoutconstraint

30
推荐指数
5
解决办法
2万
查看次数

什么是iOS内存占用的正确统计数据.直播字节?真实记忆?其他?

我在这一点上肯定很困惑.

我有一个iPad应用程序,在对象分配工具中显示"Live Bytes"使用量为6-12mb.如果我拉起内存监视器或活动监视器,"真实内存"列在经过一些严重的使用后一直攀升到80-90mb左右.

那么我是否有正常的内存占用或高内存?

这个答案这个答案声称您应该观看"Live Bytes",因为"Real Memory"列显示已发布的内存块,但操作系统尚未回收它.

另一方面,这个答案声称你需要注意那个内存监视器,因为"Live Bytes"不包括界面元素之类的东西.

什么是iOS内存占用的处理!?:)

memory memory-management diagnostics ios

26
推荐指数
2
解决办法
7382
查看次数

iOS崩溃'NSInternalInconsistencyException',原因:'语句仍处于活动状态'核心数据缓存相关?

偶尔会在屏幕上的崩溃报告中看到这些弹出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)

iphone core-data objective-c nsfetchedresultscontroller ios

16
推荐指数
2
解决办法
1万
查看次数

所有方向的UITableViewCell中的动态UILabel高度/宽度

我的问题基本上归结为在UITableCell中支持UILabel的动态高度(我想其他元素)的最佳方法,并且在旋转时正确地调整标签宽度/高度和单元格高度.

我知道如何获得UILabels的预期高度,并相应地调整高度,但是当你支持横向时,事情似乎也变得非常棘手.

我认为这可能是layoutSubviews的路线,但我不确定如何将它与需要计算单元格高度的表结合起来.另一篇有趣的帖子在init上手动设置框架,以确保它们在已知数量的情况下进行计算,但这只能解决部分问题.

所以这是我正在处理的图像,红色箭头指向动态高度标签,蓝色箭头指向将改变高度的单元格.

动态UILabel /单元格高度/宽度

我已经设法让它正常工作,但不确定它是否是正确的方法.

以下是我学到的一些内容:

  • cell.frame in cellForRowAtIndexPath始终以纵向模式显示其大小.(即,对于iPhone应用程序,它总是报告320).
  • 在属性中存储原型单元格以供参考具有相同的问题,始终处于纵向模式
  • 在这个用例中,标签宽度的自动调整掩码似乎没用,事实上导致计算旋转高度的问题
  • tableView.frame以cellForRowAtIndexPath正确的方向给出其大小
  • 你需要[tableView reloadData]轮换.我找不到任何其他方法来更新单元格和标签高度

以下是我为此工作所采取的步骤:

  1. 禁用UILabel上的任何自动调整大小的掩码,因为它们会因某种原因干扰获取正确的标签高度
  2. 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)
  3. 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)
  4. cellForRowAtIndexPath我计算标签框架的框架并更新它

    cell = [tableView dequeueReusableCellWithIdentifier:@"DescriptionCell"];
    ((CWProductDetailDescriptionCell *)cell).descriptionLabel.text = …
    Run Code Online (Sandbox Code Playgroud)

uikit ios

15
推荐指数
1
解决办法
2万
查看次数

垂直对齐UILabel文本与约束,没有换行(自动布局,单行)

因此,我在IB中设置了视图,使得此文本标签通过约束与缩略图的顶部对齐.

在此输入图像描述

但是,正如我们所知,您无法在UILabel中垂直对齐文本.我的文本根据内容的长度更新字体大小.全尺寸文本看起来很棒,而视图上的小文本明显较低.

在此输入图像描述

现有的解决方案涉及任一呼叫sizeToFit或更新的UILabel的帧匹配的文本的高度.不幸的是,后者(尽管很难看)解决方案不能很好地解决你不应该更新框架的限制.当你需要让文本自动收缩直到它被截断时,前一个解决方案基本上不起作用.(因此它不适用于有限数量的行和自动收缩).

现在,为什么uilabel的内在尺寸(高度)不像宽度那样更新,当它被设置为它的自然尺寸时,通过"尺寸适合内容"超出了我.似乎它肯定应该,但事实并非如此.

所以我一直在寻找其他解决方案.据我所见,您可能需要在标签上设置高度约束,并在计算文本高度后调整高度常量.谁有一个很好的解决方案?

ios autolayout

15
推荐指数
1
解决办法
6145
查看次数

关于Ember中控制器的典型行为

ember.js中的控制器是否意味着与iOS中的主视图区域/场景相关联,或者更多地与一组数据相关联?

在ember中将几个主要视图绑定到同一个控制器是否常见/明智?

在iOS中,屏幕的主要部分或部分绑定到单个控制器.如果您想要提供另一个主界面,比如创建一个新元素的模态窗口,您(通常)会有一个完全独立的控制器来管理该视图及其数据/逻辑.

在像Zend框架,你有可能执行确保认证一些常见的起转步骤控制器,但主要的操作播放控制器在iOS版的角色,处理逻辑,并提供了1个主段或视图中的数据(即网络,这通常最终成为整个页面).

在ember中使用控制器的典型角色或建议模式是什么?

ember.js

12
推荐指数
1
解决办法
2868
查看次数