小编Amy*_*all的帖子

在Cocoa中编写自己的@dynamic属性

假设(为了参数)我有一个包含NSDictionary的视图类.我想要一大堆属性,所有属性都可以访问该字典的成员.

例如,我想@property NSString* title@property NSString* author.

对于这些属性中的每一个,实现都是相同的:对于getter,call [dictionary objectForKey:propertyName];和setter,对setObject:forKey:执行相同的操作.

这需要花费大量时间并使用大量的复制粘贴代码来编写所有这些方法.有没有办法自动生成它们,就像Core Data使用NSManagedObject子类的@dynamic属性一样?为了清楚起见,我只希望这种方法可以访问我在标题中定义的属性,而不仅仅是任意键.

我遇到过valueForUndefinedKey:作为键值编码的一部分,它可以处理getter,但我不完全确定这是否是最好的方法.

我需要这些是显式属性,所以我可以在Interface Builder中绑定它们:我最终计划为这个视图编写一个IB调色板.

(顺便说一句,我知道我使用NSDictionary来存储这些的例子有点人为.我实际上是在编写WebView的子类,属性将引用HTML元素的ID,但这对我的问题的逻辑并不重要!)

cocoa objective-c

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

UICollectionView水平滚动,删除最后一项,动画不起作用

我有一个UICollectionView.它水平滚动,只有一行项目,行为类似于分页UIScrollView.我正在制作Safari选项卡选项卡的内容,因此您仍然可以看到每个项目的边缘.我只有一个部分.

如果我删除的项目不是最后一项,则一切都按预期工作,新项目从右侧滑入.

如果我删除了最后一项,那么集合视图的滚动位置会跳转到第N-1项(不能平滑地设置动画),然后我会看到第N项(我删除的项)淡出.

此行为与我所做的自定义布局无关,因为即使我将其切换为使用普通流布局也会发生这种情况.我正在使用以下内容删除项目:

[self.tabCollectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
Run Code Online (Sandbox Code Playgroud)

还有其他人经历过这个吗?它是UICollectionView中的错误,是否有解决方法?

cocoa-touch uikit ios uicollectionview

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

布置矩形避免碰撞(算法帮助)

我有一个(大)水平滚动视图,还有一堆我想在其上定位的矩形.每个矩形具有所需的水平位置,但如果需要,它可以从该位置变化一定量(常数,K).矩形不得重叠.矩形的垂直位置是任意的(当然,约束于视图的高度).

理想情况下,我希望矩形的大小是可变的...我想如果这是不可能的,我可以使尺寸只在一个维度上变化.

现在,这种布局将不可能:由于只有一定数量的垂直空间,并且它们只能将K像素远离其理想水平方向移动,因此可能并非所有矩形都能够被绘制.为了解决这个问题,每个矩形都有一个优先级(P),优先级较低的矩形应该先省略.(您可以假设这是非模糊的,并且您可以始终分辨哪两个矩形具有更高的优先级.)

我是在概念算法的东西,但如果你需要细节,这将在iPad上运行,并将有几千(> 1000但<10,000)矩形需要考虑.理想情况下,每当用户更改缩放级别时,我都希望能够快速重新运行,但如果这不容易,那么我可以缓存这些位置.对象是时间轴上的照片,我希望在事件发生时大致接近它们 - 我要去近似,以便在那里获得更多.

我已经看过像这样的算法,它做了非交叉的技巧,但是对于每个只允许移动一定数量的项目没有相同的想法.显然没有后一种约束,你可以显示所有项目,所以我还需要一些方法知道在什么点上不能再显示矩形.

如果解决上述问题太困难,我欢迎提出一个更务实的想法.如果所有其他方法都失败了,我可以随时按优先顺序执行某些操作,如果可以,则将每个项目呈现在所需的位置,如果不是,则尝试垂直移动,如果仍然没有,则将其水平移动到允许的限制,然后继续下一个.优先级排序意味着可能会找到次优解决方案,但它会对最重要的项目进行加权. 在此输入图像描述

algorithm layout

9
推荐指数
1
解决办法
1181
查看次数

UIKit绘图是线程安全的:你如何获得图形上下文?

因此,正如本答案iOS 4.0发行说明中所述,UIKit现在有一些线程安全的绘图工具:

在UIKit中绘制图形上下文现在是线程安全的.特别:

  • 用于访问和操作图形上下文的例程现在可以正确处理驻留在不同线程上的上下文.
  • 字符串和图像绘制现在是线程安全的.
  • 现在可以安全地使用多个线程中的颜色和字体对象.

这很好,但是你如何使用它?

据我所知,只要你不在里面,-drawRect:你只能使用UIKit/UIGraphics绘制,如果你通过UIGraphicsBeginImageContext()或创建自己的上下文UIGraphicsPushContext(),但根据文档,这些函数不是线程安全的,并且-drawRect()是总是在主线程上调用.

我假设在主线程上创建一个图像上下文然后启动后台方法将是一个非常糟糕的主意,因为竞争条件很多.

那么,我如何使用iOS 4中引入的基于多线程UIKit的绘图内容?我错过了哪些其他方式获得活跃的UIKit图形上下文?

PS我知道我可以使用Core Graphics进行绘制并完成它.由于各种原因(遗留代码),我想继续使用基于UIKit的绘图方法.

uikit ios

9
推荐指数
1
解决办法
2964
查看次数

核心数据,NSPredicate,ANY key.path == nil

我想出了一个使用子查询的解决方案,但我不明白为什么我第一次尝试做的事情没有用.

这是我的数据模型.我正在寻求建议.

在此输入图像描述

我可以将以下内容作为谓词:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == %@", aTerrainObject];
Run Code Online (Sandbox Code Playgroud)

工作正常,并返回任何一条建议,其中至少有一个条件具有该地形类型.

但是,当我尝试这样做时,它失败了:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"];
Run Code Online (Sandbox Code Playgroud)

我想要做的是返回任何一条建议,其中至少有一个条件没有设置地形类型.

但是,以下工作正常:

[NSPredicate predicateWithFormat:@"SUBQUERY(conditions, $x, $x.terrain == nil).@count > 0"];
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么,在搜索nil时,我不能使用ANY语法?

core-data nspredicate

9
推荐指数
1
解决办法
4704
查看次数

在UITableView中,批量行插入/删除的顺序是什么?

UITableView允许您使用beginUpdates和批量编辑操作endUpdates.

我的问题是:我是否需要先知道它是删除还是插入?或者我可以在之前通过索引路径引用所有内容beginUpdates并且它会神奇地工作吗?

假设我有一张桌子:

A (currently index path 0,0)
B (0,1)
C (0,2)
D (0,3)
E (0,4)
F (0,5)
Run Code Online (Sandbox Code Playgroud)

我想把它变成:

A (0,0)
C (0,1)
D (0,2)
H (0,3)
E (0,4)
F (0,5)
Run Code Online (Sandbox Code Playgroud)

因此,我删除了B(在0,1处)并插入了H(在D-之后插入删除之前的0,4或之后的0,3).

那么,在我的开始/结束更新调用之间,哪些会起作用?

  1. deleteRowsAtIndexPaths:0,1,后跟insertRowsAtIndexPaths:0,4
  2. deleteRowsAtIndexPaths:0,1,后跟insertRowsAtIndexPaths:0,3
  3. insertRowsAtIndexPaths:0,4,然后是deleteRowsAtIndexPaths:0,1
  4. insertRowsAtIndexPaths:0,3,然后是deleteRowsAtIndexPaths:0,1

cocoa-touch uitableview ios

8
推荐指数
1
解决办法
1020
查看次数

Objective-C ARC和传递C对象数组

如果这是一个C-noob问题,我很抱歉:我知道我需要注意我的指针.不幸的是我在截止日期,所以没有时间完成整本书的章节,所以我希望有更多有针对性的建议.

我想在C数组中存储一些Objective-C对象.我正在使用ARC.如果我在Mac上,我可以使用NSPointerArray,但我在iOS上并且不可用.

我将存储一个三维C数组:从概念上讲,我的维度是day,height和cacheNumber.每个元素都是指向Objective-C对象的指针,或者是NULL.

高速缓存的数量(即cacheNumber维度的大小)在编译时是已知的,但其他两个是未知的.此外,阵列可能非常大,所以我需要为它动态分配内存.

关于所有权语义,我需要对对象的强引用.

我希望整个三维数组成为Objective-C对象的实例变量.

我计划有一个方法- tableForCacheNumber:(int)num days:(int*)days height:(int*)height.该方法应该返回一个二维数组,即一个特定的缓存号.(它还通过引用传回它返回的数组的大小.)

我的问题:

  • 我应该将我的维度放在什么顺序,以便我可以轻松地返回指向一个特定缓存号的子数组的指针?(我认为它应该是第一个,但我不是100%.)

  • 我的方法的返回类型应该是什么,以便ARC不抱怨?我不介意返回的数组是否有增加的引用计数,只要我知道它正在做什么.

  • 我的实例变量应该包含三维数组的类型是什么类型?我认为它应该只是一个指针,因为ivar只表示指向我数组中第一个项目的指针.正确?如果是这样,我该如何指定?

  • 当我创建三维数组(对于我的ivar)时,我想我会做类似的事情calloc(X * Y * Z, sizeof(id)),并将结果转换为我的ivar类型?

  • 当从ivar中的三维数组访问项目时,我相信我每次都必须取消引用指针,例如(*myArray)[4][7][2].正确?

  • 我是否会同样访问从方法返回的二维数组?

  • 我需要标记返回的二维数组objc_returns_inner_pointer吗?

我再次感到遗憾,这是一个糟糕的Stack Overflow问题(它太长而且部分太多).我希望SO公民会原谅我.为了提高我的互联网业力,也许我会在这个项目发布时将其写成博客文章.

objective-c ios automatic-ref-counting

8
推荐指数
2
解决办法
3318
查看次数

iOS 6中的MKRoadWidthAtZoomScale?

来自以下文档MKRoadWidthAtZoomScale:

您不应该使用此功能来检索iOS 6及更高版本中的道路宽度.

是否有其他功能可以替代使用,或者这只是iOS 6中缺少的功能?

奇怪的是,如果你不应该使用它,那么该函数不会被弃用.

mapkit ios

7
推荐指数
1
解决办法
913
查看次数

UIImagePNGRepresentation()和比例(iPhone 4屏幕)

我有一些图像生成代码使用UIGraphicsBeginImageContext(),UIGraphicsGetImageFromCurrentImageContext()和UIImagePNGRepresentation()来做一些绘图,然后将其作为PNG保存到磁盘供以后使用.

UIImagePNGRepresentation()是否考虑了规模?如果我有一个20点宽的图像,那么得到的PNG是20像素还是40像素?

此外,当我显示这些图像时,我使用[UIImage imageWithContentsOfFile:]和[image drawInRect:].有没有办法提示这些方法使用更高分辨率的绘图?

iphone cocoa-touch uikit ios4 iphone-4

6
推荐指数
1
解决办法
2108
查看次数

没有核心数据的NSTreeController,最简单的拖动重新排序方式?

我上课了Field.每个实例都包含一个NSMutableArray subfields,它们是更多的Field对象.

对于我的UI,我使用的是NSTreeController和NSOutlineView.

我希望能够通过拖动重新排序和移动字段.我不确定最简单的方法.网上的大多数教程似乎都专注于核心数据,核心数据本质上是无序的,因此需要更多的技巧才能开始工作.我的模型基于有序的数组.

我能找到的大部分教程都是在Tiger时代编写的,其中流行的智慧最终是"不要使用NSTreeController,它是有缺陷的",否则他们专注于Core Data.

cocoa cocoa-bindings

6
推荐指数
0
解决办法
275
查看次数

UITableViewCell子类,用代码绘制,动画中的删除按钮

我正在开发一个自定义的UITableViewCell子类,其中所有内容都是用代码绘制而不是使用UILabels等.(这是部分学习练习,部分原因是因为代码绘制速度要快得多.我知道对于几个标签它不会产生巨大的差异,但最终我想把它推广到更复杂的细胞.)

目前我正在努力使用删除按钮动画:如何在删除按钮滑入时为单元缩小设置动画.

图片

首先,我正在绘制单元格contentView的自定义子视图.一切都是在那个子视图中绘制的.

我通过在单元格本身上捕获layoutSubviews来设置子视图的大小,并执行:

- (void)layoutSubviews
{
    [super layoutSubviews];
    CGRect b = [self.contentView bounds];
    [subcontentView setFrame:b];    
}
Run Code Online (Sandbox Code Playgroud)

我这样做而不仅仅是设置自动调整掩码,因为它在测试中似乎更可靠,但我可以在测试中使用自动调整掩码方法(如果需要).

现在,当有人点击减号时发生的默认事情是视图被压扁.

在此输入图像描述

在设置我的手机时,我可以避免这种情况

subcontentView.contentMode = UIViewContentModeRedraw;
Run Code Online (Sandbox Code Playgroud)

这给了我正确的最终结果(我的自定义视图重新绘制了新的大小,并且布局正确,就像我发布的第一张图片一样),但过渡的动画令人不快:它看起来像细胞拉伸并收缩回到尺寸.

我知道为什么动画是这样的:Core Animation不会要求你的视图重绘每一帧,它会重新绘制动画的结束位置,然后进行插值以找到中间位.

另一种解决方案是做

subcontentView.contentMode = UIViewContentModeLeft;
Run Code Online (Sandbox Code Playgroud)

这只是在我的单元格上绘制删除按钮,所以它覆盖了它的一部分.

在此输入图像描述

如果我也实施

- (void) didTransitionToState:(UITableViewCellStateMask)state
{
    [self setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud)

然后,一旦删除按钮在单元格中"滑动"滑动到正确的大小.这样就没有漂亮的滑动动画了,但至少我在最后得到了正确的结果.

我想我可以在出现删除按钮的同时运行我自己的动画,暂时创建另一个视图,其中包含旧视图中我的视图图像的副本,将我的视图设置为新大小,并在它们之间淡入淡出 - 这样就会是一个很好的交叉淡入淡出,而不是一个急剧的跳跃.有人用这种技术吗?

现在,你可能会问为什么我不能使用该contentStretch属性并给它一个区域来调整大小.问题是我正在做一些合理的通用,所以它并不总是可行的.在这个特定的例子中,它可以工作,但更复杂的单元可能不会.

所以,我的问题(在所有这些背景之后)是:在这种情况下你做了什么?有没有人有自定义绘制单元格的动画删除按钮?如果没有,最好的妥协是什么?

cocoa-touch core-animation uitableview ios

6
推荐指数
1
解决办法
1761
查看次数

NSOutlineView源列表样式,基于视图,更改字体

我正在使用具有源列表样式的NSOutlineView,并使用基于视图(而不是基于单元格)的大纲视图.

我希望能够使一些行变粗.但是,我尝试更改字体(在IB中手动,通过viewForTableColumn中的代码:......,或通过Font Bold绑定)到目前为止都被忽略了.

从这条消息来看,这似乎是因为NSOutlineView的源列表样式接管了文本字段的外观:

我猜你已经将你的文本字段连接到NSTableCellView的textField出口了?如果是这样,我认为您可能会遇到NSTableView对源列表的外观自动管理.

尝试从textField插座断开文本字段,看看您的自定义字体是否粘贴.

如果我断开textField插座,外观确实在我的控制之下,我的插件工作.

但是,现在我不能让它看起来像自动的.我的意思是,当NSOutlineView管理文本字段的外观时,字体是粗体并且在选择任何项目时获得了投影,但是当我手动管理它时,情况并非如此.

任何人都可以回答以下问题之一:

  1. 当NSOutlineView管理文本字段的外观时,如何使字体粗体绑定起作用
  2. 如果我没有NSOutlineView管理我的文本字段的外观,我怎么能让它看起来和行为就像我管理它一样?

cocoa nsoutlineview

5
推荐指数
1
解决办法
2251
查看次数

核心数据与AND的许多NSPredicate

我正在尝试为find-as-type-type搜索栏编写查询.我想要做的是查询"Kind",并返回任何具有LocalName的种类('name'LIKE%@ AND localeIdentifier ==%@).

如果我只搜索名称(因此忽略localeIdentifier),我可以这样做:

ANY localized.name LIKE %@
Run Code Online (Sandbox Code Playgroud)

我想要的更像是什么

ANY localized.(name LIKE %@ AND localeIdentifier == %@)
Run Code Online (Sandbox Code Playgroud)

总而言之,搜索"Kind",多对多关系中的任何一个项目"本地化"应该与name和localeIdentifier都匹配.

有关正确语法的任何想法吗?

cocoa core-data nspredicate

3
推荐指数
1
解决办法
2095
查看次数