iCarousel线性类型从中心开始

时间:2013-01-22 07:34:20

标签: ios xcode icarousel

我希望iCarousel从左边开始出现,即应该左对齐。我发现在线性转盘的情况下,它从屏幕中心开始。

如何让线性轮播从左开始?

7 个答案:

答案 0 :(得分:8)

就我而言,我在viewDidLoad中使用方法[self.vwCoverFlow scrollToItemAtIndex:2 animated:YES];帮助了我。

答案 1 :(得分:4)

如果你想要一个线性滚动,你可以使用swipeView类,它来自与iCarousel相同的开发人员,但仅用于线性滚动。我已经使用它,它确实支持左对齐。 它易于添加和使用,与iCarousel相同

这是代码https://github.com/nicklockwood/SwipeView

的链接

答案 2 :(得分:1)

将wrap属性设置为YES并将placeholderinCarousel的数量返回为2

答案 3 :(得分:1)

我遇到了同样的问题并且通过以下黑客来做这件事;)

<强>问题: 我需要有一个视图,只显示3个始终保持对齐的项目。

解决: 我所做的是总是至少制作3个项目。如果我有0,1或2个项目,我总是创建3个,但是那些不需要显示的项目我创建为空UIView。我总是有2个占位符,但在某些情况下,其中一个或两个都是空的。

e.g。 如果我们要显示2个项目,我实际上创建了3个,但第三个是空UIView。我正在创建两个占位符和一个Item。

  • 第一项是指数0
  • 的第一个占位符
  • 第二项是项目
  • 第三项是第二个占位符但空UIView

如果我们要显示1个项目,我再创建三个,但第二个和第三个是空的UIView。与前面的示例相同,我创建了两个占位符和一个Item。

  • 第一项是指数0
  • 的第一个占位符
  • 第二项是项目,但空UIView
  • 第三项是第二个占位符但空UIView

由于这个逻辑,我总是在重用([v removeFromSuperview])时清理视图,以确保它是干净的,如果需要显示新的,我正在添加它([view addSubview ...)。 占位符

的逻辑相同

如果您需要有超过3个显示的项目,您可以使用相同的逻辑,但将值3更改为其他值。如果我错了,请更新我;)

这是我的代码的一部分,对我有用;)

- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel
{
    return [[self getRecordings] count] > 3? [[self getRecordings] count] - 2: 1;
}

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view
{
    if (view == nil)
    {
        view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 30)];
    }
    else
    {
        // If reusing remove content from holder view for fake items
        for (UIView *v in view.subviews)
        {
            [v removeFromSuperview];
        }
    }

    if ([[self getRecordings] count] >= 2)
    {
        [view addSubview:[(RecordingItemViewController*)[_recordingItemViewControllers objectAtIndex:index + 1] view]];
    }

    return view;
}

- (NSUInteger)numberOfPlaceholdersInCarousel:(iCarousel *)carousel
{
    return 2;
}

- (UIView *)carousel:(iCarousel *)carousel placeholderViewAtIndex:(NSUInteger)index reusingView:(UIView *)view
{
    if (view == nil)
    {
        view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 30)];
    }
    else
    {
    // If reusing remove content from holder view for fake items
        for (UIView *v in view.subviews)
        {
            [v removeFromSuperview];
        }
    }

    if (([[self getRecordings] count] > 0 && [[self getRecordings] count] < 3 && index == 0) || [[self getRecordings]count] >= 3)
    {
        [view addSubview:[(RecordingItemViewController*)(index == 0? [_recordingItemViewControllers objectAtIndex:0]: [_recordingItemViewControllers lastObject]) view]];
    }

    return view;
}

答案 4 :(得分:1)

这对我有用

    - (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel{

       [carousel scrollToItemAtIndex:photosArray.count/2 animated:YES];

        return [photosArray count];
       }

答案 5 :(得分:0)

在您的情况下,我建议使用2个占位符。

例如:你有n张照片,那么你将有(n-2)件物品和2个占位符。     - 项目索引从1到(n-2)。     - 占位符索引为0和(n-1)。 现在我们将有一些这样的代码:

#pragma mark iCarousel DataSource

- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel
{
    //if we have n photos, then number of items is (n-2)
    int count = _movieGalleries.count;
    return count >= 3 ? count - 2 : count;
}

- (NSUInteger)numberOfPlaceholdersInCarousel:(iCarousel *)carousel
{
    //2 placeholder
    return _movieGalleries.count >= 3 ? 2 : 0;
}

#pragma mark iCarousel Delegate
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view
{ 
   //reuse your view
   UIView *yourview = ...

    //get your data
    //index of item is 1 -> n-2, index of placeholder is 0 and n-1
    Item *item = [_listItems objectAtIndex:index + 1];

    //config your view
    ...
    return yourView;
}

- (UIView*)carousel:(iCarousel *)carousel placeholderViewAtIndex:(NSUInteger)index reusingView:(UIView *)view
{
    //index of placeholder is 0 and n-1
    //Trick: we use viewForItemAtIndex for getting placeholder view
    index = index == 0 ? - 1 : carousel.numberOfItems;
    return [self carousel:carousel viewForItemAtIndex:index reusingView:view];
}

- (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index 
{

    //in carousel with placeholder, index of selected item is -1, 0, 1, ..., (n-2). which -1 and (n-2) is index of placeholders. So that we need to increase index by 1
    NSLog("current index: %i", index + 1);
}

答案 6 :(得分:0)

SWIFT 5:

对我有用的解决方案:将轮播宽度设为屏幕宽度的两倍,并将轮播限制为屏幕的 XAnchor,然后添加 contentOffset,即轮播宽度的 0.5 倍。在某些 containerView: UIView 中而不是直接在 viewController 上呈现轮播也很重要。这是有效的,因为轮播的第一个项目以轮播的中心为中心。如果将轮播设置为视图大小的两倍并将 contentOffset 设置在左侧(- 轮播大小的 0.5 倍),则中心将位于视图的左侧。下面是一些示例代码:

设置轮播尺寸:

carousel.leadingAnchor.constraint(equalTo: containerView.leadingAnchor).isActive = true
carousel.trailingAnchor.constraint(equalTo: containerView.trailingAnchor).isActive = true
carousel.translatesAutoresizingMaskIntoConstraints = false
carousel.heightAnchor.constraint(equalToConstant: 200).isActive = true
carousel.widthAnchor.constraint(equalTo: self.containerView.widthAnchor, multiplier: 2).isActive = true
carousel.centerXAnchor.constraint(equalTo: containerView.centerXAnchor).isActive = true
carousel.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true

设置轮播内容偏移:

carousel.contentOffset = CGSize(width: - containerView.frame.size.width, height: 0)

设置属性 scrollToItemBoundry ,这样当您向右大量滚动时,您的轮播项目不会超出您的范围:

carousel.scrollToItemBoundary = true

稍后您将您的 containerView 添加到您的 viewController.view

viewController.view.addSubView(containerView)
containerView.translatesAutoresizingMaskIntoConstraints = false
containerView.centerXAnchor.constraint(equalTo: viewController.view.centerXAnchor).isActive = true
containerView.centerYAnchor.constraint(equalTo: viewController.view.centerYAnchor).isActive = true