这种观点和控制是如何完成的?

时间:2011-09-26 21:34:15

标签: iphone cocoa-touch ipad user-interface

图像附在下面。基本上它是流行的照片编辑应用程序Snapseed。当您在正在编辑的图像上触摸拖动时,视图中的表格将动画显示在图像顶部的可见性及其选项,如下图所示。最重要的一点是它从屏幕上移开手指时消失了,你可以通过在触摸拖动图像后立即继续向上或向下触摸拖动,从该表中的下面5个选项之一中进行选择使菜单出现。选择完成后,它会将选择传递回父级并消失。关于如何做到这一点的任何想法?

enter image description here

2 个答案:

答案 0 :(得分:2)

带有按钮的视图可能是隐藏的,直到带有图像的视图检测到触摸,然后它执行 touchesBegan:withEvent:方法,该方法是UIResponder类的一部分。大多数视图都是UIResponder的子类,因此这是一个内置方法,以及 touchesEnded:withEvent:。当touchesEnded:withEvent:执行时,按钮视图被解除。 (它要么立即隐藏,要么动画阿尔法值直到消失。)


更多信息

以下是Keith Lazuka的kal Calendar中的一些代码。此代码查看触摸结束的位置,以确定日历上的“图块”被击中。我想这里可以使用相同的东西来确定你的例子中选择了哪个“按钮”。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self receivedTouches:touches withEvent:event];
}


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self receivedTouches:touches withEvent:event];
}

 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
 {
 UITouch *touch = [touches anyObject];
 CGPoint location = [touch locationInView:self];
 UIView *hitView = [self hitTest:location withEvent:event];

 //[self receivedTouches:touches withEvent:event];

 if ([hitView isKindOfClass:[KalTileView class]]) {
 KalTileView *tile = (KalTileView*)hitView;

 if (tile.belongsToAdjacentMonth) {
 if ([tile.date compare:[KalDate dateFromNSDate:logic.baseDate]] == NSOrderedDescending) {
 [delegate showFollowingMonth];
 } else {
 [delegate showPreviousMonth];
 }
 self.selectedTile = [frontMonthView tileForDate:tile.date];
 } else {
 //self.selectedTile = tile;
 }
 }
 self.highlightedTile = nil;
 }

关键在于touchesEnded方法的前三行代码。

hitTest:withEvent:是一个UIView的实例方法,它根据触摸结束发生的点位置,告诉您触发touchesEnded事件时触发了哪个视图。

正如您在此示例代码中所看到的,它确实返回了一个UIView实例(或者是子类化UIView的东西)。一旦知道识别出哪个视图,就可以编写代码以执行所需的操作。

答案 1 :(得分:0)

它可以是一个简单的UIView,作为子视图添加,用bringSubviewToFront显示。当菜单显示时再次点击图像会发生什么?