如何在 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 的自定义主题在文本字段上指定悬停边框颜色

在 TouchesBegan 上更改图像

如何在 Swagger UI 中发送带有请求的自定义标头?

如何将 QGraphicsView 提升为 .ui 文件中的自定义小部件?

Django ManyToMany 字段上的自定义列名