我想要像whts应用程序那样的照片滑块。它应该访问内置照片库中的所有图片或部分图片,并且应该可以使用滚动视图滚动。
我试过用不同的照片查看器,但所有东西都有记忆问题。所以不确定是否有人有它的工作解决方案。真的很感谢你的帮助。
谢谢你,
Ankita
这几乎可以正常工作,但背板方向滚动有一个小问题。只要尝试一下,你就可以找到一些前进的方向,并可能找到更好的解决方案。
(使用ELCImagePicker第一次显示所有图像,然后在选择一个时显示滚动视图,一次显示大图像。显示10个图像还调整了ELCImagePickerController的代理方法,以获得所选图像的索引)
首次加载时,即从ELCImagePickerController 中选择图像时
- (void)elcImagePickerController:(ELCImagePickerController *)picker didFinishPickingMediaWithInfo:(NSArray *)info selectedIndex:(NSInteger)_index {
[self dismissModalViewControllerAnimated:NO];
for (UIView *v in [scrollview subviews]) {
[v removeFromSuperview];
}
infoItems = [[NSArray alloc]initWithArray:info];
CGRect workingFrame = scrollview.frame;
workingFrame.origin.x = 0;
int indexFrame = picker.selectedIndex;
newIndex = indexFrame;
for(int i = 0; i < [info count]; i++)
{
NSDictionary *dict = [info objectAtIndex:i];
UIImageView *imageview = [[UIImageView alloc] initWithImage:[dict objectForKey:UIImagePickerControllerOriginalImage]];
[imageview setContentMode:UIViewContentModeScaleAspectFit];
imageview.frame = workingFrame;
imageview.tag = i;
if(i >= indexFrame && i <= indexFrame + 9)
{
[scrollview addSubview:imageview];
workingFrame.origin.x = workingFrame.origin.x + workingFrame.size.width;
}
}
[scrollview setPagingEnabled:YES];
[scrollview setContentSize:CGSizeMake(workingFrame.origin.x, workingFrame.size.height)];
[scrollview scrollRectToVisible:CGRectMake(0, 0, workingFrame.size.width, workingFrame.size.height) animated:NO];
self.scrollview.hidden = NO;
self.pageControll.hidden = NO;
self.pageControll.numberOfPages = [[scrollview subviews]count];
index = 0;
lastContentOffset = scrollview.contentOffset.x;
NSLog(@"lastContentOffset %.2f",lastContentOffset);
}
之后在scrollViews委托方法
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
NSLog(@"ScrollViewDidEndDecelerating is called with subview(s) %d",[[scrollview subviews]count]);
if(lastContentOffset < scrollView.contentOffset.x)
{
index += (int)(scrollview.contentOffset.x - lastContentOffset)/scrollview.frame.size.width;
newIndex += (int)(scrollview.contentOffset.x - lastContentOffset)/scrollview.frame.size.width;
self.pageControll.currentPage = index;
NSLog(@"Index incremented %d n newIndex %d",index,newIndex);
if(index == [[scrollView subviews]count]-1)
{
if(newIndex < [infoItems count]-1)
{
[self performSelector:@selector(reloadScrollViewWithNewImages)];
}
}
[Appirater userDidSignificantEvent:YES];
}
else if(lastContentOffset > scrollView.contentOffset.x)
{
index -= (int)(lastContentOffset - scrollview.contentOffset.x)/scrollview.frame.size.width;
newIndex -= (int)(int)(lastContentOffset - scrollview.contentOffset.x)/scrollview.frame.size.width;
self.pageControll.currentPage = index;
NSLog(@"Index decremented %d n newIndex %d",index,newIndex);
if(index == 0)
{
if(newIndex > 0)
{
newIndex -= 9;
if(newIndex < 0)
newIndex = 0;
[self performSelector:@selector(reloadScrollViewWithNewImages)];
}
}
[Appirater userDidSignificantEvent:YES];
}
lastContentOffset = scrollView.contentOffset.x;
NSLog(@"New lastContentOffset %.2f",lastContentOffset);
}
用于重新加载滚动视图的方法如下
-(void)reloadScrollViewWithNewImages
{
for (UIView *v in [scrollview subviews]) {
[v removeFromSuperview];
}
CGRect workingFrame = scrollview.frame;
workingFrame.origin.x = 0;
NSLog(@"reloadScrollView newIndex %d",newIndex);
int indexFrame = newIndex;
for(int i = 0; i < [infoItems count]; i++)
{
NSDictionary *dict = [infoItems objectAtIndex:i];
UIImageView *imageview = [[UIImageView alloc] initWithImage:[dict objectForKey:UIImagePickerControllerOriginalImage]];
[imageview setContentMode:UIViewContentModeScaleAspectFit];
imageview.frame = workingFrame;
imageview.tag = i;
if(i >= indexFrame && i <= indexFrame + 9)
{
[scrollview addSubview:imageview];
workingFrame.origin.x = workingFrame.origin.x + workingFrame.size.width;
}
}
[scrollview setPagingEnabled:YES];
[scrollview setContentSize:CGSizeMake(workingFrame.origin.x, workingFrame.size.height)];
[scrollview scrollRectToVisible:CGRectMake(0, 0, workingFrame.size.width, workingFrame.size.height) animated:NO];
self.scrollview.hidden = NO;
self.pageControll.hidden = NO;
index = 0;
self.pageControll.numberOfPages = [[scrollview subviews]count];
NSLog(@"number %d",[[scrollview subviews]count]);
lastContentOffset = scrollview.contentOffset.x;
NSLog(@"reloadScrollView's lastContentOffset %.2f",lastContentOffset);
}
并且在该代码中所需的.h文件的接口部分中声明的所有使用的属性和私有ivar都是
私人ivars
NSInteger index;
float lastContentOffset;
属性
@property (nonatomic,strong) IBOutlet UIScrollView *scrollview;
@property (strong, nonatomic) NSArray *infoItems;
@property (assign, atomic) int newIndex;
快乐编码:)
您可以使用CATiledLayer绘制图像。CATiledLayer可用于提高高分辨率图像或大型照片集的分页、平移和缩放性能。
正如我在上面评论的那样,你可以使用可重用的视图方法,这意味着一次只有三个imagview或视图会在内存中。假设您正在显示照片编号:2,那么,您应该将照片编号:1、2和3保存在内存中(即,为了避免闪烁),不需要一次加载所有照片。假设你滚动到照片编号:3,那么你的逻辑应该丢弃照片编号:1,并加载照片编号:2,3,4。如果你仍然没有或者不知道如何通过编程来实现这一点,那么不要担心。苹果的好的示例代码是可用的,它可以做你想要的一切。
样本代码
在上面的示例代码中,他们显示了两种显示图像的方式
一种是直接将图像显示/设置为图像视图
第二种是使用以下方法用TileView绘制图像:- (void)displayTiledImageNamed:(NSString *)imageName size:(CGSize)imageSize
如果你想了很多关于记忆的问题,那么你肯定必须使用第二种方法。