是否期望具有自定义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)
这是如何布局的.请注意文本下方的额外间距.
为了比较:
奇怪的是缺乏一致性.当标签延伸到第二行时,底线不再包含此额外间距:
当有一行文本时,有没有办法删除这个行间距?或者其他一些方法来强制执行某些一致性,这样我至少可以解释它?
更新
基线计算似乎也被打破了.尝试将视图(此处为红色框)与标签的基线对齐时,会部分覆盖多行标签.
我偶然发现了以下设置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)
如果我使用较短的版本,有没有办法删除当前正在迭代的项目(即"我")?或者我需要使用更长的格式?
我有一个UIView包含多行的子类UILabel.此视图使用autolayout.

我想设置该视图为tableHeaderView的UITableView(不是一节头).此标题的高度取决于标签的文本,而标签的文本又取决于设备的宽度.那种场景自动布局应该很棒.
我发现并尝试了 许多 解决方案来实现这一点,但无济于事.我试过的一些事情:
preferredMaxLayoutWidth在期间为每个标签设置一个layoutSubviewsintrinsicContentSizetableHeaderView手动设置框架.我遇到的一些各种失败:
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) 比方说,我添加UITextView到我的UIView,我希望它每次的内容的变化而变化的背景颜色.我可以通过成为UITextView和实施的代表来做到这一点textViewDidChange.
如果我经常使用这种行为,那么创建一个UITextView子类是有意义的,我将调用它ColorSwitchingTextView.它应该包括默认的颜色切换行为,这样任何人UIView都可以简单地添加它而不是标准,UITextView如果它想要这种行为.
如何检测ColorSwitchingTextView班级内容的变化?我认为我不能做类似的事情self.delegate = self.
总之,UITextView子类如何知道其内容何时发生变化?
编辑似乎我可以使用self.delegate = self,但这意味着使用它的UIViewController ColorSwitchingTextView也不能订阅通知.一旦我switchingTextView.delegate = self在视图控制器中使用,子类行为就不再起作用了.任何解决方法?我试图获得一个习惯UITextView,否则就像常规一样UITextView.
我有一个非常简单的代码块,用于模拟键盘事件.下面的简单例子应该输入"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时,我是否缺少一些东西?我认为这可能是一个错误 - 我会在哪里举报?
更新 - 许多人坚持要我为该物业申报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) 我正在优化我的设备上看起来很慢的转换.UIViewController当UITableView选择一行时,我正在推动另一个.在行选择之后和推送新视图之前有明显的暂停.
一些日志记录表明我的所有代码都相当快,从行选择到推送控制器viewWillAppear.但是之间的时间viewWillAppear和viewDidAppear记录在0.7秒左右.
过渡本身(我相信)应该只需0.3秒.什么可以解释其余部分?
我正在测试iPhone 4,所以我不期待最快的性能.但我应该能够在同一设备上匹配其他类似应用程序的相同性能,不是吗?
我正在努力通过动画动画删除tableview的页眉/页脚内容.我相信我可以在标题内容本身上调用removeFromSuperview,或者只是将标题分配给nil,但我不知道如何为此设置动画.一个简单的动画块不会做任何事情 - 如何淡入/淡出视图(在这种情况下为标签)?
我知道子类UITableViewCell可以willTransitionToState在转换时实现和执行自定义代码.但有没有办法找到一个细胞的当前状态?
如果没有,我应该继承UITableViewCell并定义一个属性currentState,我总是在我的更新willTransitionToState?然后我将总是有办法知道任何特定细胞的状态.
似乎很奇怪,我不能问一个单元格当前状态是什么(0,1,2或3).
也许我错过了一些简单的事情.我从一个按钮添加了一个模态segue到一个视图控制器.然后我添加了一些准备ForSegue的步骤(并检查我是否正确命名了segue).我已经做了几次没有问题.
现在,当我单击按钮时,模态窗口打开,但prepareForSegue不会触发.我尝试在prepareForSegue中添加一个日志语句,然后再检查标签的描述(理论上它应该触发任何segue).但我什么也没记录.
有任何想法吗?
ios ×7
cocoa-touch ×5
objective-c ×3
uitableview ×3
autolayout ×2
cocoa ×2
uiview ×2
animation ×1
gcc ×1
gcc4 ×1
inheritance ×1
iphone ×1
macos ×1
performance ×1
segue ×1
uilabel ×1
uitextview ×1
xcode4.2 ×1