小编Ben*_*ard的帖子

UILabel的行间距,单行文本

是否期望具有自定义lineSpacing属性的多行UILabel 包括该行间距,即使标签的文本适合一行?

这是我的标签:

let label = UILabel()
label.numberOfLines = 4
var paragraph = NSMutableParagraphStyle()
paragraph.lineSpacing = 5
paragraph.lineBreakMode = .ByTruncatingTail
label.attributedText = NSAttributedString(string: "Some short text", attributes: [NSParagraphStyleAttributeName: paragraph])
Run Code Online (Sandbox Code Playgroud)

这是如何布局的.请注意文本下方的额外间距.

在此输入图像描述

为了比较:

在此输入图像描述

奇怪的是缺乏一致性.当标签延伸到第二行时,底线不再包含此额外间距:

在此输入图像描述

当有一行文本时,有没有办法删除这个行间距?或者其他一些方法来强制执行某些一致性,这样我至少可以解释它?

更新

基线计算似乎也被打破了.尝试将视图(此处为红色框)与标签的基线对齐时,会部分覆盖多行标签.

在此输入图像描述 在此输入图像描述

nsattributedstring uilabel ios autolayout

18
推荐指数
1
解决办法
3630
查看次数

从NSMutableArray中删除对象

我偶然发现了以下设置for循环的快捷方式(与我一直使用的教科书示例相比,快捷方式):

for (Item *i in items){ ... }
Run Code Online (Sandbox Code Playgroud)

与较长的格式相反:

for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right
Run Code Online (Sandbox Code Playgroud)

如果我使用较短的版本,有没有办法删除当前正在迭代的项目(即"我")?或者我需要使用更长的格式?

cocoa objective-c nsmutablearray

16
推荐指数
3
解决办法
4万
查看次数

在tableHeaderView中使用autolayout

我有一个UIView包含多行的子类UILabel.此视图使用autolayout.

在此输入图像描述

我想设置该视图为tableHeaderViewUITableView(不是一节头).此标题的高度取决于标签的文本,而标签的文本又取决于设备的宽度.那种场景自动布局应该很棒.

我发现并尝试 许多 解决方案来实现这一点,但无济于事.我试过的一些事情:

  • preferredMaxLayoutWidth在期间为每个标签设置一个layoutSubviews
  • 定义一个 intrinsicContentSize
  • 试图找出视图所需的大小并tableHeaderView手动设置框架.
  • 设置标头时向视图添加宽度约束
  • 一堆其他的东西

我遇到的一些各种失败:

  • 标签超出视图的宽度,不包裹
  • 帧的高度为0
  • 应用程序崩溃异常 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)

uitableview uiview ios autolayout nslayoutconstraint

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

UITextView子类作为自己的委托

比方说,我添加UITextView到我的UIView,我希望它每次的内容的变化而变化的背景颜色.我可以通过成为UITextView和实施的代表来做到这一点textViewDidChange.

如果我经常使用这种行为,那么创建一个UITextView子类是有意义的,我将调用它ColorSwitchingTextView.它应该包括默认的颜色切换行为,这样任何人UIView都可以简单地添加它而不是标准,UITextView如果它想要这种行为.

如何检测ColorSwitchingTextView班级内容的变化?我认为我不能做类似的事情self.delegate = self.

总之,UITextView子类如何知道其内容何时发生变化?

编辑似乎我可以使用self.delegate = self,但这意味着使用它的UIViewController ColorSwitchingTextView也不能订阅通知.一旦我switchingTextView.delegate = self在视图控制器中使用,子类行为就不再起作用了.任何解决方法?我试图获得一个习惯UITextView,否则就像常规一样UITextView.

cocoa-touch objective-c uitextview uiview ios

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

CGEventPost - 模拟键盘事件时可能出现的错误?

我有一个非常简单的代码块,用于模拟键盘事件.下面的简单例子应该输入"Cz" - 换档键下降,c键下降,c上升,换档上升.然后z键向下和向上.

看来有时订单会变得混乱.当我创建一个计时器来每秒调用这个例程时,输出应该是CzCzCzCz ....但这是我得到的:

CZcZCZCzczCzczCzczCZCZCzCz

我会再次运行它:

CzCzCzCzCZCzCZCzCZCzCZCzCZCzCzCz

不同.同样错了.

代码:

e1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)56, true);
CGEventPost(kCGSessionEventTap, e1);
CFRelease(e1);
e2 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, true);
CGEventPost(kCGSessionEventTap, e2);
CFRelease(e2);
e3 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, false);
CGEventPost(kCGSessionEventTap, e3);
CFRelease(e3);
e4 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)56, false);
CGEventPost(kCGSessionEventTap, e4);
CFRelease(e4);

e7 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)6, true);
CGEventPost(kCGSessionEventTap, e7);
CFRelease(e7);
e8 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)6, false);
CGEventPost(kCGSessionEventTap, e8);
CFRelease(e8);
Run Code Online (Sandbox Code Playgroud)

在如何实现shift键的keydown和keyup时,我是否缺少一些东西?我认为这可能是一个错误 - 我会在哪里举报?

macos quartz-graphics

13
推荐指数
2
解决办法
8004
查看次数

(不是这样)使用属性时愚蠢的Objective-C继承问题 - GCC Bug?

更新 - 许多人坚持要我为该物业申报iVar.有些人说不是这样,因为我正在使用Modern Runtime(64位).我可以确认我已经成功使用@property而没有iVars几个月了.因此,我认为'正确'的答案是解释为什么在64位上我突然必须明确声明iVar何时(并且仅当)我将从子类访问它.到目前为止,我见过的唯一一个可能是GCC错误(感谢Yuji).毕竟不是那么简单......为了澄清可能的错误:当从基类继承时,子进程无法访问父进程的iVar,并且在访问iVar之前,该子进程也恰好使用@synthesize实现了一个UNRELATED访问器.

我一直在摸不着头几个小时 - 我没有太多使用遗产.

在这里,我设置了一个简单的Test B类,它继承自Test A,其中声明了一个ivar.但是我得到了变量未声明的编译错误.这只发生在我添加属性和合成声明时 - 没有它们就可以正常工作.

TestA标题:

#import <Cocoa/Cocoa.h>
@interface TestA : NSObject {
    NSString *testString;
}
@end
Run Code Online (Sandbox Code Playgroud)

TestA实现为空:

#import "TestA.h"
@implementation TestA  
@end
Run Code Online (Sandbox Code Playgroud)

TestB标题:

#import <Cocoa/Cocoa.h>
#import "TestA.h"
@interface TestB : TestA {
}
@property (nonatomic, retain) NSString *testProp;
@end
Run Code Online (Sandbox Code Playgroud)

TestB实现(错误 - 'testString'未声明)

#import "TestB.h"
@implementation TestB
@synthesize testProp;
- (void)testing{
    NSLog(@"test ivar is %@", testString);
}
@end
Run Code Online (Sandbox Code Playgroud)

inheritance cocoa gcc objective-c gcc4

13
推荐指数
1
解决办法
4010
查看次数

viewWillAppear和viewDidAppear之间会发生什么?

我正在优化我的设备上看起来很慢的转换.UIViewControllerUITableView选择一行时,我正在推动另一个.在行选择之​​后和推送新视图之前有明显的暂停.

一些日志记录表明我的所有代码都相当快,从行选择到推送控制器viewWillAppear.但是之间的时间viewWillAppearviewDidAppear记录在0.7秒左右.

过渡本身(我相信)应该只需0.3秒.什么可以解释其余部分?

我正在测试iPhone 4,所以我不期待最快的性能.但我应该能够在同一设备上匹配其他类似应用程序的相同性能,不是吗?

iphone performance cocoa-touch uiviewcontroller ios

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

动画UITableView的页眉和页脚

我正在努力通过动画动画删除tableview的页眉/页脚内容.我相信我可以在标题内容本身上调用removeFromSuperview,或者只是将标题分配给nil,但我不知道如何为此设置动画.一个简单的动画块不会做任何事情 - 如何淡入/淡出视图(在这种情况下为标签)?

animation cocoa-touch core-animation uitableview ios

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

确定单元的当前状态

我知道子类UITableViewCell可以willTransitionToState在转换时实现和执行自定义代码.但有没有办法找到一个细胞的当前状态?

如果没有,我应该继承UITableViewCell并定义一个属性currentState,我总是在我的更新willTransitionToState?然后我将总是有办法知道任何特定细胞的状态.

似乎很奇怪,我不能问一个单元格当前状态是什么(0,1,2或3).

cocoa-touch uitableview ios

10
推荐指数
2
解决办法
3122
查看次数

Segue没有打电话给prepareForSegue

也许我错过了一些简单的事情.我从一个按钮添加了一个模态segue到一个视图控制器.然后我添加了一些准备ForSegue的步骤(并检查我是否正确命名了segue).我已经做了几次没有问题.

现在,当我单击按钮时,模态窗口打开,但prepareForSegue不会触发.我尝试在prepareForSegue中添加一个日志语句,然后再检查标签的描述(理论上它应该触发任何segue).但我什么也没记录.

有任何想法吗?

cocoa-touch ios xcode4.2 segue

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