2014-03-05 105 views
1

an iPhone app几个“信牌”可以左右拖动:如何在touchesBegan的自定义UIView中调整UILabel的位置?

app screenshot

拖动和显示更大的图像和字体在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):

Xcode screenshot

,但无法找到一个满意的解决方案,但(调整后的位置没有按”不得不在科学上确切)。

作为一个iOS编程新手我不确定我有什么选择,有谁可以请建议如何解决它最好?

就像将value标签的基线与letter标签的底线对齐,并确保它们只是彼此接触(而不是相交) - 可能吗?

+1

为了确保rect不交叉使用方法'CGRectIntersectRect'并且每当这个条件满足时相应地将交叉矩形的框架移动到某个点。 –

回答

1

在我看来,你正在处理系统中的2个非常知名的状态,为什么不简单地定义2个静态位置状态,你需要将标签放在你的UIView中,并将它们的位置静态地设置在你的UIView中代码也!

您已经设置了UILabels的尺寸,为什么不是他们的位置!

它还看来,如果你是缩放全红矩形,以及,你可以试试这个方法还有:

Scale UIView and all its children

如果缩放整个的UIView,然后相对定位和调整您的保持它看起来像小时一样。

+0

+1谢谢。我不知道Interface Builder中有“位置状态”(我只知道Apache/Adob​​e Flex中的“状态”)。你有一个文档或教程?或者你的意思是截图? –

+0

@AlexanderFarber - 你已经有了与touchesBegan,touchesMoved和touchesEnded一起设置的状态。当touchesBegan进来时,只需简单地设置'_letter'和'_value'的位置,基本上与在touchesMoved中设置self.frame位置的方式基本相同,只有您可以增加大小,在touchesBegan中移动字母和数字位置, touchesEnded。 – trumpetlicks

+0

在源代码中?或者是否有可能在IB? –

相关问题