现在我正在制作一个 iOS 应用程序,我想通过简单地“删除字母”来实现删除 UILabel 中的字母的能力。我遇到问题的部分是将手势识别器添加到 UILabel 的各个字母中。我已经在网上搜索过这个并且什么都没有。为了清楚起见,我不是在整个标签中添加手势识别器,我只是想将它添加到单个字母中。任何帮助是极大的赞赏。
谢谢
现在我正在制作一个 iOS 应用程序,我想通过简单地“删除字母”来实现删除 UILabel 中的字母的能力。我遇到问题的部分是将手势识别器添加到 UILabel 的各个字母中。我已经在网上搜索过这个并且什么都没有。为了清楚起见,我不是在整个标签中添加手势识别器,我只是想将它添加到单个字母中。任何帮助是极大的赞赏。
谢谢
似乎最简单的方法是动态计算字母的位置。用这个:
CGSize textSize = [text sizeWithFont:[UIFont boldSystemFontOfSize:size]
constrainedToSize:constrainedSize
lineBreakMode:NSLineBreakByWordWrapping];
因此您可以获取每个标签使用的字体和大小中字母的大小,并使用[stringInstance length]
属性和[UILabel numberOfLines]
属性来获取标签中每个字母的大致中心,然后对每个标签使用简单的 tapGestureRecognizer 并在那里调用你的方法
- (NSString*)letterForPoint:(CGPoint)tapCenter inLabel:(UILabel*)label;
在那里,您使用一切来计算每个字母的近似中心,并添加一个 selectableRange 用于错误并纠正用户响应为 x +- 20 像素和 y +- 20 像素。
Apple 表示,对于 40 像素的可选边界小于 40 像素的任何内容都会让用户感到非常恼火,因此您的字体大小实际上应该非常大,以方便用户交互。
如果我理解正确,听起来 UILabel 的子类化是有道理的。
创建一个LetterLabel: UILabel
类并在 init 中设置你的 GestureRecognizer 。
然后,当您创建字母时,每个字母都会附加识别器
LetterLabel *firstLetter = [[LetterLabel alloc] init]
LetterLabel *secondLetter = [[LetterLabel alloc] init]
UIGestureRecognizer 只能应用于 UIView 或其子类(例如,像 Adam 建议的 UILabel)。如果您担心性能,那么我认为您的下一步是:
1) 子类 UIView 以创建类似 UILabel 的视图的自定义实现。
2)在drawInRect:方法中画出自定义标签的字符串
3) 使用 touchesBegan:withEvent:、touchesMoved:withEvent: 和 touchesEnded:withEvent: 方法来跟踪手指位置,以便移动/重绘支持字符串的字符。
编辑:
或者,您可以在自定义标签上使用一个 UIPanGestureRecognizer 来跟踪手指位置,并在自定义标签的范围内移动子层(每个子层可以包含字符串中的一个字符)。这样,您可以更轻松地利用 Core Animation 为角色设置动画(即创建“掉落”效果)。