如果您想查看我有问题的代码,下面是链接:代码
我的问题与我的过去的问题有关。
我的NSMutableArray确实有问题,我目前正在为我的slotMachine对象(slot1和slot2)使用iCarousel。我的应用程序是这样工作的:
在PhotoViewController中,我创建了一个有缩略图的视图,然后用按钮指定它的框架。因此,如果按下1个图像,它将通过NSUserDefaults保存该整数。然后我将在我的carouselViewController中检索它
我正在考虑调整数组,但我做不到。我也在这里尝试过我的问题:如果我能像与NSMutableArray的比较那样做,它会很容易,但仍然不起作用。
(附加信息:)
我是这样做的,有一个包含UIImageView的视图控制器,其中有一个按钮,所以当用户点击它时,我的CustomPicker就会弹出。我的CustomPicker包含了用户在相机卷上选择的图像。因此,每个按钮都有一个使用NSUserDefaults发送给我的NSUserDefaults的特定值。carousel1用于第一个时隙,carousel2用于第二个时隙。
下面是我想要做的事情:我想强行让它停止使用用户选择的索引。(这是我在carouselDidEndScrollingAnimtaion上做的)
在我的carouselDidEndScrollingAnimation方法中,我测试了我的所有条件(单独的),它在比较方面非常完美。然后,当我结合这些条件时,前两个比较或停止是正确的,但是后面的两个总是错误的。或者有时候搞混了。
我需要滚动两个特定的索引/整数,这是用户选择的(我已经这样做了)能够滚动2对索引,但是接下来的两个总是错误的,因为我认为有索引正在调整。
图片:
下面的图片是我的PhotoViewController,它包含了我的游戏的比较阶段SETTING。UIImageVIew和UIButton.Image将根据这个数字被强制显示,并且应该被强制显示。

当我的iCarousel启动时,它会停止,例如在下面的图像中(这与上面的不同):

将强制滚动到PhotoViewController中输入的图像。
转入:

摘要:是这样的。我在那里有一个settingsView,我将导入Slot1 & Slot2的图像(多个)。然后,在另一个视图中,显示上面图像的PhotoViewController。THe第一列对应于第一时隙,其次是第二时隙。如果按下一个视图(例如,No. 1 of Slot 1 ),它将加载从Picker中为Slot 1选择的图像的缩略图。
您必须执行4次(对)-->这里显示的内容,我通过NSUserDefaults通过button.tag获取他们的索引,然后发送到iCarouselView。
然后,当您完成(按下Done按钮)时,它将转到iCarouselView,如上面所示,这就是它的视图。当按下它时,它会旋转几秒钟,当它完成而不是停留在PhotoView中选择的用户时,它将有力地滚动到该索引。
问题:
是否有办法使我的数组或我的iCarousel.view在我删除时不调整它们的索引。以正确的方式保留我的索引。或者还有其他解决方案,比如调整我的数组,就像调整我的PhotoViewController选择的索引一样。因为我认为,当数组保留它们的索引,甚至删除它们时,我就能够解决这个问题。但还是不能。
希望你能理解我的问题。
发布于 2012-07-12 20:30:15
是否有办法使我的数组或我的iCarousel.view在我删除时不调整它们的索引。以正确的方式保留我的索引。或者还有其他解决方案,比如调整我的数组,就像调整我的PhotoViewController选择的索引一样。因为我认为,当数组保留它们的索引,甚至删除它们时,我就能够解决这个问题。但还是不能。
修改iCarousel管理索引的方式的唯一方法是修改代码。实际上,如果您查看iCarousel.m中的removeViewAtIndex方法,您将看到索引是通过一个NSDictionary管理的,并且在删除时,字典将被重新排列(条目被重新排序)。你可以采取这样的方法:
- (void)removeViewAtIndex:(NSInteger)index
{
NSMutableDictionary *newItemViews = [NSMutableDictionary dictionaryWithCapacity:[itemViews count] - 1];
for (NSNumber *number in [self indexesForVisibleItems])
{
NSInteger i = [number integerValue];
if (i < index)
{
[newItemViews setObject:[itemViews objectForKey:number] forKey:number];
}
else if (i > index)
{
[newItemViews setObject:[itemViews objectForKey:number] forKey:[NSNumber numberWithInteger:i - 1]];
}
}
self.itemViews = newItemViews;
}您可以对数组应用相同的逻辑,以便旋转木马和数组保持同步。当然,如果您将索引存储在某个地方(slot1/slot2/slot2/slot4?),您也应该在删除元素后更新它们的值。
另一方面,我认为你在这里要求的是如何做一些你认为能解决问题的事情,但你并没有真正解释问题的所在。事实上,如果我对你的理解正确,你所做的就是:
在删除某些元素之后,这没有理由不起作用(除非iCarousel有一些bug,否则解决方案就是捕获bug)。唯一的部分是知道哪个索引是您想要移动的。
作为建议,我将首先简化您的委托carouselDidEndScrollingAnimation方法。实际上,您的carouselDidEndScrollingAnimation有一个名为carousel的参数,我认为这是该方法中唯一应该引用的旋转木马。如果您没有看到它,这就是原因:每个旋转木马都将停止滚动,carouselDidEndScrollingAnimation将被调用;因此该方法将被调用两次。每次执行该方法时,您都将修改carousel1和carousel2的状态(通过调用scrollToItemAtIndex);因此,在每个旋转木马上,您将调用scrollToItemAtIndex两次。
对我来说这听起来不太正确。因此,您应该找到一种方法,在调用carousel1时只滚动carouselDidEndScrollingAnimation,而在调用carousel2时只滚动carousel2。
更广泛地说,我想提出的另一点是:
似乎不是最好的实现,因为用户会看到旋转木马停止,然后重新开始。
我处理这个问题的方法是直接修改iCarousel实现,以便它支持您需要的特定行为。
具体来说,看看iCarousel.m中的step方法。这将在每个帧中调用,以生成旋转木马动画。现在,在这个方法中有一个decelerating分支:
else if (decelerating)
{
CGFloat time = fminf(scrollDuration, currentTime - startTime);
CGFloat acceleration = -startVelocity/scrollDuration;
CGFloat distance = startVelocity * time + 0.5f * acceleration * powf(time, 2.0f);
scrollOffset = startOffset + distance;
[self didScroll];
if (time == (CGFloat)scrollDuration)
{
decelerating = NO;
if ([delegate respondsToSelector:@selector(carouselDidEndDecelerating:)])
{
[delegate carouselDidEndDecelerating:self];
}
if (scrollToItemBoundary || (scrollOffset - [self clampedOffset:scrollOffset]) != 0.0f)
{
if (fabsf(scrollOffset/itemWidth - self.currentItemIndex) < 0.01f)
{
//call scroll to trigger events for legacy support reasons
//even though technically we don't need to scroll at all
[self scrollToItemAtIndex:self.currentItemIndex duration:0.01];
}
else
{
[self scrollToItemAtIndex:self.currentItemIndex animated:YES];
}
}
else
{
CGFloat difference = (CGFloat)self.currentItemIndex - scrollOffset/itemWidth;
if (difference > 0.5)
{
difference = difference - 1.0f;
}
else if (difference < -0.5)
{
difference = 1.0 + difference;
}
toggleTime = currentTime - MAX_TOGGLE_DURATION * fabsf(difference);
toggle = fmaxf(-1.0f, fminf(1.0f, -difference));
}
}
}当旋转木马停止减速时,它会再次滚动。这与您所做的完全相同,因此您可能会找到一种方法来修改这段代码,并将旋转木马滚动到所需的索引。这样你就可以更顺利地旋转旋转木马了。
希望这有助于并为冗长的答复道歉。
发布于 2012-07-09 17:02:33
要知道这是什么问题有点困难。您是否对图像使用单个NSMutableArray,并使用NSUserDefaults值在数组中的索引处获取对象?
我不能百分之百地肯定正在发生的事情。用户做什么(以及在哪个视图中)以及在该视图之后触发什么(显示哪个视图)。
您是否试图停止图像上的“旋转”图像,该图像与从上一视图中选择的图像相同?
根据上面的图片,图像是由一个单一的索引关闭的。每次都是这样吗?也许从数组中获取有问题。
如果你能给我更多的信息我能帮上忙。
我看了一下你粘贴的代码,我想这可能是你的问题。
if (twoSlot1 > [(UIImageView*)[self.carousel2 currentItemView] tag]){
[self.carousel1 scrollToItemAtIndex:(-twoSlot1)-2 duration: 3.5f];
} else {
[self.carousel1 scrollToItemAtIndex:-twoSlot1 duration: 3.5f];
}在所有类似的代码块上,都有这样的代码块,您可以在其中调用每个旋转木马。在上面的代码中,您可以两次调用旋转木马1。
if (slot2 > [(UIImageView*)[self.carousel1 currentItemView] tag]){
[self.carousel1 scrollToItemAtIndex:(-slot2)-2 duration: 3.0f];
} else {
[self.carousel1 scrollToItemAtIndex:-slot2 duration: 3.0f];
}
if (twoSlot2 > [(UIImageView*)[self.carousel2 currentItemView] tag]){
[self.carousel2 scrollToItemAtIndex:(-twoSlot2)-2 duration: 3.5f];
} else {
[self.carousel2 scrollToItemAtIndex:-twoSlot2 duration: 3.5f];
}当你应该拨打2号的时候,你就打给self.carousel1。
这是正确的吗?
发布于 2012-07-13 08:40:37
提到你的问题。您需要一个在从数组中删除成员时不更改其成员索引的数组。
我想你可以用NSMutableDictionary。它是一个关联数组,也就是说,索引是由您选择的,当您从中间删除一个成员时,索引保持不变。您仍然可以使用0.n作为索引。您仍然可以使用NSArray中熟悉的一些方法,例如count。您可以使用枚举数来遍历字典的所有成员。另一方面,您仍然可以使用for-循环,因为您习惯于将它们与数组一起使用。只要做好准备,a) objectForKey:如果键/索引不存在(例如,已被删除),并且计数保留对象的数量,但不像数组那样返回最高的index+1,那么我可能返回零。
https://stackoverflow.com/questions/11200584
复制相似问题