NavigationControllers具有ViewController堆栈来管理和限制动画过渡.
将视图控制器作为子视图添加到现有视图控制器需要将事件传递给子视图控制器,这很难管理,几乎没有烦恼,并且通常在实现时感觉像是一个糟糕的黑客(Apple也建议不要这样做).
呈现模式视图控制器再次将视图控制器放在另一个上面,虽然它没有上面描述的事件传递问题,但它并没有真正"交换"视图控制器,而是堆叠它.
故事板仅限于iOS 5,几乎是理想的,但不能在所有项目中使用.
有人可以在没有上述限制的情况下更改视图控制器的方式提供一个SOLID代码示例,并允许它们之间的动画过渡?
一个接近的例子,但没有动画: 如何在没有导航控制器的情况下使用多个iOS自定义视图控制器
编辑:导航控制器使用很好,但需要动画过渡样式(不仅仅是幻灯片效果),显示的视图控制器需要完全交换(不是堆叠).如果第二个视图控制器必须从堆栈中删除另一个视图控制器,那么它的封装不够.
编辑2:iOS 4应该是这个问题的基本操作系统,我应该在提到故事板时澄清(上图).
当我按照所有说明(包括苹果的视频)拖动文本以在xcode中创建代码片段时,我得到了一个不同的系统行为:我看到的只是选择ibeam ...我无法拖动.它最终会再次选择文本.我错过了一些明显的Apple主义吗?谢谢
在Xcode 4中创建项目时,它会询问要添加到所有新文件的类前缀.
在项目启动后,有没有办法改变(或删除)这个?
我这里有一个简单的示例项目:
http://dl.dropbox.com/u/7834263/ExpandingCells.zip
在这个项目中,UITableView有一个自定义的UITableViewCell.在每个单元格中有3个包含标签的UIViews.
目标是在敲击时扩展单元格,然后在再次敲击时将其折叠.单元格本身必须更改其高度以显示子视图.插入或删除行是不可接受的.
演示项目几乎按预期工作.事实上,在iOS 4.3中,它的工作非常完美.然而,在iOS 5下,当行崩溃时,先前的单元格神奇地消失.
要重新创建问题,请在iOS 5的模拟器或设备中运行项目,然后点击第一个单元格以展开它.然后再次点击该单元格以折叠它.最后,直接点击它下面的单元格.前一个消失了.
继续点击该部分中的每个单元格将导致所有单元格消失,直到整个部分缺失的位置.
我也尝试使用reloadData而不是当前的设置,但这会破坏动画并且感觉有点像黑客.reloadRowsAtIndexPaths应该可以工作,但问题是为什么不呢?
查看下面发生的事情的图像:
表格出现:

细胞扩展:

细胞塌陷:

细胞消失(当敲击下面的细胞时):

不断重复,直到整个部分消失:

编辑: 覆盖alpha是一个黑客,但有效.这是另一个"黑客"修复它,但为什么它修复它?
JVViewController.m第125行:
if( previousIndexPath_ != nil )
{
if( [previousIndexPath_ compare:indexPath] == NSOrderedSame ) currentCellSameAsPreviousCell = YES;
JVCell *previousCell = (JVCell*)[self cellForIndexPath:previousIndexPath_];
BOOL expanded = [previousCell expanded];
if( expanded )
{
[previousCell setExpanded:NO];
[indicesToReload addObject:[previousIndexPath_ copy]];
}
else if( currentCellSameAsPreviousCell )
{
[previousCell setExpanded:YES];
[indicesToReload addObject:[previousIndexPath_ copy]];
}
//[indicesToReload addObject:[previousIndexPath_ copy]];
}
Run Code Online (Sandbox Code Playgroud)
编辑2:
对演示项目做了一些小改动,值得检查并查看JVViewController didSelectRowAtIndexPath方法.
我有一个UIButton,我想调整大小以适应其中的任何文本.它的设置宽度为280,但文本应该换行到下一行,并根据需要扩展按钮的高度.
我已经为Word Wrap设置换行符并尝试使用sizeToFit,但这只会使按钮变宽,而不是垂直.
我通过setExpanded:方法调用改变高度来扩展单元格.
然后我调用reloadRowsAtIndexPaths:刷新单元格.
问题是细胞消失并随机重新出现.我怀疑这与索引工作方式有关.
如果我调用reloadData或beginUpdates/endUpdates,单元格按预期工作,但我丢失了动画.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
JVCell *cell = (JVCell*)[tableView cellForRowAtIndexPath:indexPath];
JVCell *previousCell = nil;
if( previousIndexPath_ != nil ) // set to nil in viewDidLoad
{
previousCell = (JVCell*)[tableView cellForRowAtIndexPath:previousIndexPath_];
}
// expand or collapse cell if it's the same one as last time
if( previousCell != nil && [previousIndexPath_ compare:indexPath] == NSOrderedSame && [previousCell expandable] )
{
[previousCell setExpanded:![cell expanded]];
NSArray *indexPathArray = [NSArray arrayWithObject:previousIndexPath_];
[tableView reloadRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationAutomatic];
}
else
{
// collapse previous …Run Code Online (Sandbox Code Playgroud) 当我要将UIImageView显示为子视图时,如何添加反弹效果?我必须使用CoreAnimation来做到这一点吗?我现在唯一的猜测是使用CAKeyframeAnimation,如果有更好的方法,请告诉我.这是我目前的代码:
CABasicAnimation * theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
theAnimation.delegate = self;
theAnimation.duration = 1.0;
theAnimation.fromValue = [NSNumber numberWithFloat:notif.center.y];
theAnimation.toValue = [NSNumber numberWithFloat:notif.center.y-20];
theAnimation.repeatCount = 3;
Run Code Online (Sandbox Code Playgroud) 我在iPad启动图像中收到以下警告,但不是iPhone图像:

我无法在任何地方找到与警告相关的文字.
这是我的plist设置:

和我的图像文件:

当我尝试"Default-iPad.png"时,它也没有解决它.
图像尺寸为768 x 1024(纵向)和1024 x 768(横向).
我想将视图控制器推入堆栈,然后弹出第一个推动新控制器的控制器.
-(void) someMethod {
MegaSuperAwesomeViewController *tempVC = [[MegaSuperAwesomeViewController alloc] init];
[self.navigationController pushViewController:tempVC animated:YES];
[tempVC release];
// pop this VC, how?
}
Run Code Online (Sandbox Code Playgroud)
编辑:事实证明,一旦完成新的VC,我可以弹出2个视图控制器.仍然不是我想要的,但它的确有效.缺点是我需要设置一个标志来指示覆盖的视图已完成.
我熟悉Xcode中组和实际目录之间的差异.我总是在finder中创建一个实际的文件夹并将其拖到项目中,确保取消选中"copy".
当我移动文件夹时,我只通过引用删除项目,在finder中移动它们,然后重新添加它们.
现在我第一次使用git,并在我的测试中发现,如果我使用上述方法删除目录,我就无法进行提交.Xcode告诉我它无法切换到目录,因为"没有这样的文件或目录".根据我在网上找到的内容,在Xcode中完成目录更改时,git不会收到通知.
如何在Xcode 4中使用git移动文件和文件夹,让编译器和git知道移动,以便我可以提交?
iphone ×8
ios ×5
ipad ×4
xcode ×4
xcode4 ×3
objective-c ×2
uitableview ×2
git ×1
ipod ×1
uianimation ×1
uibutton ×1
xcode4.2 ×1
xcode4.3 ×1