滚动视图中 Tapped imageview 的 Contentoffset
Posted
技术标签:
【中文标题】滚动视图中 Tapped imageview 的 Contentoffset【英文标题】:Contentoffset for Tapped imageview in scrollview 【发布时间】:2012-10-21 16:17:08 【问题描述】:我正在尝试将点击的图像保存到相册,使用 contentOffset 来检测点击要保存的图像对象,但它总是保存最后一个图像对象。
以下是我尝试计算 scrollView 中点击的图像视图的 contentOffset 的方法:
(void)viewDidLoad
UIScrollView *imageScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
imageScrollView.delegate = self;
imageScrollView.pagingEnabled = YES;
for (int i = 0; i < 61; i++)
CGFloat xOrigin = i * 320;
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton addTarget:self action:@selector(dismissView:) forControlEvents:UIControlEventTouchUpInside];
myButton.frame = CGRectMake(xOrigin, 10, 60, 35);
[myButton.layer setMasksToBounds:YES];
[myButton.layer setCornerRadius:10.0f];
myButton.layer.borderWidth = 2;
myButton.layer.borderColor = [[UIColor whiteColor] CGColor];
[myButton setTitle:@"Done" forState:UIControlStateNormal];
myButton.backgroundColor = [UIColor clearColor];
NSString *imageName = [NSString stringWithFormat:@"image%d.png", i];
UIImage *image = [UIImage imageNamed:imageName];
_imageView = [[[UIImageView alloc] initWithImage:image]autorelease];
_imageView.frame = CGRectMake(xOrigin, 0, 320, 480);
_imageView.tag = i;
[_imageScrollView viewWithTag:i+1];
UILongPressGestureRecognizer *gestureRecognizer = [[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleLongPress:)];
imageScrollView.userInteractionEnabled = YES;
[imageScrollView addGestureRecognizer:gestureRecognizer];
gestureRecognizer.delegate = self;
[gestureRecognizer release];
[imageScrollView addSubview:_imageView];
[imageScrollView addSubview:myButton];
imageScrollView.contentSize = CGSizeMake(320 * 61 , 480);
[self.view addSubview:imageScrollView];
- (void)handleLongPress:(UILongPressGestureRecognizer*)gestureRecognizer
if (gestureRecognizer.state == UIGestureRecognizerStateBegan)
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Save Photo", nil];
actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
[actionSheet showInView:self.view];
[actionSheet release];
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
switch (buttonIndex)
case 0:
[self performSelector:@selector(LongPress:) withObject:nil];
break;
default:
break;
- (void)LongPress:(UILongPressGestureRecognizer*)gestureRecognizer
CGPoint offset = _imageScrollView.contentOffset;
int imageView = floor((Offset.x - imageView / 320) / imageView) + 1;
UIImage* image = [(UIImageView*)[_imageScrollView viewWithTag:imageView] image];
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image: didFinishSavingWithError:contextInfo:), nil);
我希望这段代码保存点击的图像,但它保存了滚动视图中的最后一个图像视图。
如果我做错了,如果我仍然遗漏了什么,请告诉我。感谢您的帮助。
【问题讨论】:
【参考方案1】:原因在于您正在使用的viewDidLoad
_image = [UIImage imageNamed:imageName];
我认为这是类中的全局变量,您正在使用此对象将图像保存到相册。由于它是循环图像的最后计数中的全局变量,将指向它,因此您始终会保存最后一张图像。
您可以通过在 for 循环中将 _image
设为本地来修复它。在设置标签时,使用标签可以从 scrollView 获取 imageView/image。你可以有这样的
//your imageView in longPress function has the selected imageView's tag
UIImage* selImage = [(UIImageView*)[imageScrollView viewWithTag:imageView] image];
这应该适合你。
【讨论】:
我很困惑你到底在哪里说用 for 循环中的 _image 和标签来修复它。 我已经编辑了你发布的代码..你能从中看出..吗? 我试过了,但它仍然将滚动视图中的最后一张图像保存到相册 即使你在 for 循环中与_imageView
相同,在循环中使其成为本地.. 你可以在 LongPress 函数中记录int imageView
吗..?【参考方案2】:
int imageView = floor((Offset.x - imageView / 320) / imageView) + 1;
通过这条线
int imageView = (int)(scrollView.contentOffset.x / scrollView.frame.size.width);
【讨论】:
这样它根本不保存任何图像以上是关于滚动视图中 Tapped imageview 的 Contentoffset的主要内容,如果未能解决你的问题,请参考以下文章
在父视图中添加 ImageView 后 UIScrollView 停止滚动?
如何通过循环 swift 5 为滚动视图内的 imageView 设置 trailingAnchor.constraint