如何在 touchesBegan 上的自定义 UIView 中调整 UILabel 位置?
Posted
技术标签:
【中文标题】如何在 touchesBegan 上的自定义 UIView 中调整 UILabel 位置?【英文标题】:How to adjust a UILabel position in a custom UIView on touchesBegan? 【发布时间】:2014-03-05 20:29:20 【问题描述】:在an iPhone app 中可以拖动几个“字母图块”:
在Tile.m中实现了拖拽显示大图和字体:
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
[_normal setHidden:YES];
[_dragged setHidden:NO];
[_letter setFont:[UIFont systemFontOfSize:60]];
[_value setFont:[UIFont systemFontOfSize:20]];
[self.superview bringSubviewToFront:self];
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:self];
CGPoint previous = [touch previousLocationInView:self];
self.frame = CGRectOffset(self.frame,
(location.x - previous.x),
(location.y - previous.y));
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
[_normal setHidden:NO];
[_dragged setHidden:YES];
[_letter setFont:[UIFont systemFontOfSize:36]];
[_value setFont:[UIFont systemFontOfSize:16]];
除了右下角较小的UILabel
(它应该显示一个整数 - 字母的“值”)之外,这很好用。
我已尝试启用自动布局并添加约束...并在 Tile.xib
(此处为 fullscreen)中禁用自动布局:
但还没有找到满意的解决方案(调整后的位置不一定要科学准确)。
作为一个 ios 编程新手,我不确定我有哪些选择,有人可以建议如何最好地解决它吗?
就像将value
标签的基线与letter
标签的底线对齐 + 确保它们只是相互接触(而不是相交) - 这可能吗?
【问题讨论】:
要确保矩形不相交,请使用CGRectIntersectRect
方法,并且只要满足此条件,就将相交矩形的框架相应地移动到某个点。
【参考方案1】:
在我看来,您正在处理系统中的 2 个非常知名的状态,为什么不简单地定义需要标签位于 UIView 中的 2 个静态位置状态,并在代码中静态设置它们的位置还有!
您已经设置了 UILabel 的大小,为什么不也设置它们的位置!
看起来好像您也在缩放整个红色矩形,您也可以尝试这种方法:
Scale UIView and all its children
如果您缩放整个 UIView,那么相对定位和调整大小会使其看起来像它小的时候一样对齐。
【讨论】:
+1 谢谢。我不知道 Interface Builder 中有“位置状态”(我只知道 Apache/Adobe Flex 中的“状态”)。你有文档或教程吗?或者你的意思的截图? @AlexanderFarber - 您已经设置了 touchesBegan、touchesMoved 和 touchesEnded 的状态。当 touchesBegan 进入时,只需分别设置_letter
和 _value
的位置,基本上与在 touchesMoved 中设置 self.frame 位置的方式相同,只是你会增加大小,在 touchesBegan 中移动字母和数字位置touchesEnded。
@AlexanderFarber - 就我个人而言,我知道它可以在源代码中工作,我不确定是否有办法在 IB 中实现我所说的。以上是关于如何在 touchesBegan 上的自定义 UIView 中调整 UILabel 位置?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 touchesBegan 和 touchesEnded 检测点击手势
使用带有 Material UI 的自定义主题在文本字段上指定悬停边框颜色