在iOS 8中,UICollectionViewFlowLayout支持根据自己的内容大小自动调整单元格大小.这根据其内容在宽度和高度上调整单元的大小.
是否可以为所有单元格的宽度(或高度)指定固定值,并允许其他尺寸调整大小?
对于一个简单的示例,请考虑单元格中的多行标签,其中约束将其定位到单元格的两侧.可以通过不同方式调整多行标签的大小以容纳文本.单元格应填充集合视图的宽度并相应地调整其高度.相反,单元格的大小是随意调整的,当单元格大小大于集合视图的不可滚动维度时,它甚至会导致崩溃.
iOS 8引入了方法systemLayoutSizeFittingSize: withHorizontalFittingPriority: verticalFittingPriority:对于集合视图中的每个单元格,布局在单元格上调用此方法,传入估计的大小.对我来说有意义的是在单元格上覆盖此方法,传递给定的大小并将水平约束设置为required,并将垂直约束设置为低优先级.这样,水平尺寸固定为布局中设置的值,垂直尺寸可以灵活.
像这样的东西:
- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
UICollectionViewLayoutAttributes *attributes = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
attributes.size = [self systemLayoutSizeFittingSize:layoutAttributes.size withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityFittingSizeLevel];
return attributes;
}
Run Code Online (Sandbox Code Playgroud)
然而,这种方法给出的尺寸是完全奇怪的.关于这种方法的文档对我来说是非常不清楚的,并提到使用UILayoutFittingCompressedSize UILayoutFittingExpandedSize仅代表零大小和相当大的常量.
size这个方法的参数真的只是传递两个常量的方法吗?难道没有办法实现我期望获得给定大小的适当高度的行为吗?
1)添加将为单元格指定特定宽度的约束可实现正确的布局.这是一个糟糕的解决方案,因为该约束应该设置为单元的集合视图的大小,它没有安全的引用.在配置单元格时,可以传入该约束的值,但这似乎也完全违反直觉.这也很尴尬,因为直接向单元格或其内容视图添加约束会导致许多问题.
2)使用表格视图.由于单元格具有固定的宽度,因此表视图以这种方式开箱即用,但这不适用于其他情况,例如在多列中具有固定宽度单元格的iPad布局.
我正在尝试编写一个函数来移动RGB颜色的色调.具体来说,我在iOS应用程序中使用它,但数学是通用的.
下图显示了R,G和B值如何相对于色调变化.

看一下这似乎是一个相对简单的编写一个函数来转移色调而不做任何讨厌的转换到不同的颜色格式会引入更多的错误(如果继续对颜色进行小的移位可能会出现问题) ,我怀疑计算成本会更高.
这是我到目前为止所做的工作.如果你从纯黄色或青色或洋红色转移,它会完美地工作,但在某些地方会变得有点眩晕.
Color4f ShiftHue(Color4f c, float d) {
if (d==0) {
return c;
}
while (d<0) {
d+=1;
}
d *= 3;
float original[] = {c.red, c.green, c.blue};
float returned[] = {c.red, c.green, c.blue};
// big shifts
for (int i=0; i<3; i++) {
returned[i] = original[(i+((int) d))%3];
}
d -= (float) ((int) d);
original[0] = returned[0];
original[1] = returned[1];
original[2] = returned[2];
float lower = MIN(MIN(c.red, c.green), c.blue);
float upper = MAX(MAX(c.red, c.green), c.blue);
float spread = …Run Code Online (Sandbox Code Playgroud) 对于显然是'bug',UITextView似乎不像其他UIKit Elements那样支持字距调整.是否有解决方法来让角色工作?
为了清楚起见,我在谈论字体文件中定义的字符对之间的间距,而不是所有字符之间的一般间距.使用NSAttributedStringwith NSKernAttributeName将调整所有字符之间的间距,但内置字符对仍然不起作用.
例如:

有解决方法可以解决这个问题吗?
我发现的一个简单的解决方法是向UITextView添加css样式以启用字距调整.如果我使用未记录的方法,setContentToHTMLString:我可以将css注入文本视图中的秘密webview.
NSString *css = @"*{text-rendering: optimizeLegibility;}";
NSString *html = [NSString stringWithFormat:@"<html><head><style>%@</style></head><body>Your HTML Text</body></html>", css];
[textView performSelector:@selector(setContentToHTMLString:) withObject:html];
Run Code Online (Sandbox Code Playgroud)
这可以立即解决问题; 但是,这似乎很可能会让应用程序被拒绝.有没有一种安全的方法可以将某些css隐藏到文本视图中?
我尝试过的其他解决方法包括:
使用webview和contenteditable属性.这并不理想,因为webview会阻碍一些额外的东西,例如输入附件视图,这些视图无法轻易隐藏.
UITextView使用核心文本手动子类化和渲染文本.这比我希望的更复杂,因为所有选择的东西也需要重新配置.因为它UITextView的私人子类,如果不是完全不可能的话UITextPosition,UITextRange这是一个巨大的痛苦.
在过去,我已经为生产提供了单独的构建配置,并通过TestFlight分发了beta版本.这样可以轻松地对beta版本进行修改,例如公开应用程序的其他设置,让测试人员更彻底地测试内容,并查看有关应用程序状态的更多技术信息.
有没有办法检查是否已通过Apple的TestFlight分发应用程序以更改应用程序的运行方式?编译器指令不再有意义,因为相同的构建可以分发给beta测试人员并提交给商店,但也许有一种方法可以在运行时进行检查.
是否可以从Objective-C调用Swift中协议扩展中定义的方法?
例如:
protocol Product {
var price:Int { get }
var priceString:String { get }
}
extension Product {
var priceString:String {
get {
return "$\(price)"
}
}
}
class IceCream : Product {
var price:Int {
get {
return 2
}
}
}
Run Code Online (Sandbox Code Playgroud)
实例的价格字符串IceCream是'$ 2'并且可以在Swift中访问,但是该方法在Objective-C中不可见.编译器抛出错误'No visible @interface for'FlowCream'声明选择器......'.
在我的配置中,如果方法是直接在Swift对象的实现中定义的,那么一切都按预期工作.即:
protocol Product {
var price:Int { get }
var priceString:String { get }
}
class IceCream : Product {
var price:Int {
get {
return 2
}
} …Run Code Online (Sandbox Code Playgroud) 我遇到了一个奇怪的问题,MKMapView放置在带导航栏的视图中.给定UIScrollView在相同的情况下,其宽度,高度和中心被约束到它的superview(视图控制器的view对象),如果控制器的automaticallyAdjustsScrollViewInsets属性设置为YES,则将调整insets ,而不是设置为NO.那很棒.我无法在任何地方找到此文档,但地图视图似乎也做同样的事情,但是无法禁用它.设置automaticallyAdjustsScrollViewInsets无效.
简而言之(ish):
在下图中,无论导航栏如何,小后方都在视图中居中.地图视图也被限制为视图的大小(它延伸到导航栏后面).地图视图的位置设定为当前位置(也由蓝色圆圈表示),所以我希望他们匹配,但是他们是关闭的状态栏和导航栏一半的组合高度.
是否有对此行为的解释,以及使其按预期工作的方法?

这很奇怪,因为MKMapView不是UIScrollView的子类,但在这种情况下它的行为类似于一个.这并非完全不合理,但我希望自动调整插图在地图视图和滚动视图上一致地工作.
像这样糟糕的事情会"解决问题":
MKCoordinateRegion region = MKCoordinateRegionMake(self.coordinate, MKCoordinateSpanMake(0.008, 0.008));
MKMapRect mapRect = MKMapRectForCoordinateRegion(region);
[self.mapView setVisibleMapRect:mapRect edgePadding:UIEdgeInsetsMake(0, 0, 64, 0) animated:YES];
Run Code Online (Sandbox Code Playgroud)
既可以调整底部插图,也可以在顶部添加负插图使得事物排成一行,但是如果地图视图的这种行为发生变化,或者如果视图控制器没有导航栏,或者如果有一阵寒风.它也削弱了我从地图视图中拉回正确坐标的信心.
我正在分享一张图片,还有一个网址和一些文字UIActivityViewController.一切都很好,除了图像文件名总是'Image-1'没有扩展名.在某些情况下,这会导致一个大问题,例如邮件应用程序在没有扩展名的情况下无法打开图像.
图像由应用程序生成,并作为一个存在UIImage.
有没有办法控制文件名并为图像添加正确的扩展名?
AVAudioSession从音乐应用程序或其他人录制带有音频播放的音频时,将停止播放.这在音频会话文档中描述:
AVAudioSessionCategoryRecord用于录制音频; 此类别使播放音频静音.
有没有办法改变这种行为并执行以下操作之一?
1)继续播放其他应用程序的音频,并允许手机录制正在播放的音频.
2)简短录制完成后,恢复其他应用的音频.音频中断开始或结束时,应用程序可以响应通知.是否有某些特定的东西必须为其他应用程序接收这些通知?
我在一个应用程序中有一个Web视图,从服务器加载一个包含文本和图像的html片段.我将它包装在一个小的HTML中并将其放入这样的Web视图中:
NSString *cssPath = [[NSBundle mainBundle] pathForResource:@"style" ofType:@"css"];
NSString *cssLink = [NSString stringWithFormat:@"<link href='file://%@/' type='text/css' rel='stylesheet'/>", cssPath];
NSString *html = [[NSString stringWithFormat:@"<html><head><title></title><meta charset='UTF-8' />%@</head><body>%@</body></html>", cssLink, htmlContent] retain];
[myWebView loadHTMLString:html baseURL:currentURL];
Run Code Online (Sandbox Code Playgroud)
有没有办法修复上面的代码,以便链接到本地样式表?
如果我将基本URL更改为本地应用程序资源文件,我可以毫无问题地加载样式表,但这会破坏从服务器加载的html中的图像链接.
我还可以将样式表的内容直接包含在html中,但由于多种原因不愿意这样做.
谢谢.
UIKit文本输入组件,例如UITextView并UITextField具有inputView添加自定义键盘的属性.我有两个问题与此有关.
如果键盘当前可见且属性设置为新的输入视图,则不会发生任何事情.重新启动并重新获得第一响应者状态会刷新输入并显示新视图.这是最好的方法吗?如果是这样,它可以回答我更大的问题:
是否可以为两个输入视图之间的过渡设置动画?
ios ×8
objective-c ×7
uitextview ×2
autolayout ×1
c ×1
cocoa-touch ×1
colors ×1
css ×1
kerning ×1
mapkit ×1
mkmapview ×1
protocols ×1
rgb ×1
swift ×1
testflight ×1
uiimage ×1
uikit ×1
uitextfield ×1
uitextinput ×1
uiwebview ×1