【问题标题】:UIScrolview adding some extra space for subviewsUIScrollview 为子视图添加了一些额外的空间
【发布时间】:2019-11-25 12:10:46
【问题描述】:

我正在尝试使用 UIScrollView 创建动态图像滑块。所以在我转到预期页面之前,我发送需要多少图像,然后将滚动视图设置为将这些图像作为子视图,并在 5 秒内使用 NSTimer 自动滚动它们直到结束,然后回到开头。

当 Scrollview 第一次遍历图像时会出现问题,它显示图像 + 下一张图像的一部分。然后当滑动到下一张图像时,它会显示部分 3ed 图像.. ect

一旦滚动视图第一次浏览所有图像,然后返回第一张图像,一切都很好,所有图像都采用正确的大小。

我尝试了所有我能想到的方法,但没有运气!也许我对这份工作使用了错误的观点?我不知道..

这是我用来配置 uiscolview 的函数(在 ViewDidlayout 中调用):

scrollview = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.scrolSV.frame.size.height)];
    scrollview.delegate = self;

    [scrollview setPagingEnabled:YES];
    [scrollview setAlwaysBounceHorizontal:NO];
    [scrollview setShowsVerticalScrollIndicator:NO];
    [scrollview setShowsHorizontalScrollIndicator:NO];
    scrollview.contentInset = UIEdgeInsetsZero;
    scrollview.clipsToBounds= YES;

    CGFloat xOrigin ;

    NSArray *  tempList = [self.sightseeing.images allObjects];

    NSSortDescriptor *  sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"image_counter"
                                                 ascending:YES];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.is_image = %@", @(YES)];
    ImagesList = [tempList filteredArrayUsingPredicate:predicate];
    ImagesList = [ImagesList sortedArrayUsingDescriptors:@[sortDescriptor]];
    self.paging.numberOfPages = [ImagesList count];
    selectedOffset = 0 ;

    for (int i = 0 ; i< [ImagesList count]; i++){

        xOrigin = self.view.frame.size.width * i ;


        Images * object = [ImagesList objectAtIndex:i];
        UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(xOrigin, 0, scrollview.frame.size.width, scrollview.frame.size.height)];
        imageView.autoresizingMask = NO ;

        if (object.image.length > 5) {
            imageView.image = [UIImage imageWithData:object.image];
        }
        else
        {
            imageView.image = [UIImage imageNamed:Image_Placeholder];
        }


        [imageView setContentMode:UIViewContentModeScaleAspectFill];
        [scrollview addSubview:imageView];

    }



    [scrollview setContentOffset:CGPointMake(0, 0)];
    [scrollview setContentSize:CGSizeMake(self.scrolSV.frame.size.width *  [ImagesList count] , self.scrolSV.frame.size.height)];
    [self.scrolSV addSubview:scrollview];

这是 ScrolDidScroll 方法:


- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{

    [imageTimer invalidate];
    if (![imageTimer isValid]) {
        imageTimer = [NSTimer scheduledTimerWithTimeInterval:Timer_Length target:self selector:@selector(updateImages) userInfo:nil repeats:YES];
    }
    int offset = (int)scrollview.contentOffset.x /scrollView.frame.size.width;
    self.paging.currentPage = offset;
    if (selectedOffset != offset) {
        selectedOffset = offset;
        UIImageView * imageV= [scrollView.subviews objectAtIndex:offset];

        Images * image = [ImagesList objectAtIndex:offset];

        if (![image.image length]) {

            [QBRequest downloadFileFromClassName:Sightseeing_Table_Name objectID:self.sightseeing.object_id fileFieldName:image.field_id
                                    successBlock:^(QBResponse *response, NSData *loadedData) {
                                        if (loadedData.length > 100) {
                                            image.image = loadedData;
                                            imageV.image = [UIImage imageWithData:image.image];
                                            [imageV setContentMode:UIViewContentModeScaleAspectFill];
                                        }

                                    } statusBlock:^(QBRequest *request, QBRequestStatus *status) {

                                    } errorBlock:^(QBResponse *error) {

                                    }];
        }
    }


}

这是第一次查看时的图片

浏览图片后,显示如下:

【问题讨论】:

  • 您使用的是 iOS 还是 MacOS?您使用 iOS 进行了标记,但可能是指 MacOS 特定功能 viewDidLayout(您拼写为 ViewDidlayout)。
  • 这是 iOS,你可以在我分享的截图中看到。
  • 真的!那么你在哪里设置滚动视图呢?
  • ViewDidLayout,但我也尝试在 ViewDidLoad、WillApear 和 DidApear 上设置,每次都得到相同的结果。

标签: ios objective-c uiscrollview slider


【解决方案1】:

几年前,我在文图拉县动物服务 (VCAS) 移动应用程序(仍可免费下载)中实现了类似的功能。我使用了 Grant Davis 的名为 FGallery 的库。我不知道这是否仍然可用,但他们做得很好,包括支持缩略图和全尺寸图像查看、加载指示器、如果实际图像尚未完成下载时显示占位符图像的能力等。如果可以的话,我会自己看看。也许你只需要借用他们的一些技术,或者,只是使用他们所做的。它非常快,我的雇主在这方面要求很高。

https://github.com/gdavis/FGallery-iPhone

【讨论】:

  • 代码看起来很旧!但是让我试试吧!谢谢迈克尔
  • 真的老了! :-D 但是,它真的很好用!试用 VCAS 应用,看看它的实际效果。
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多