【发布时间】:2015-11-16 10:07:16
【问题描述】:
我正在构建一个简单的应用程序,它由带有语言的UITableViewController 组成,当单击特定单元格时,会弹出一个UIPageViewController 来表示该选定语言的图像。用户可以滚动浏览图像,一切都按需要进行。下一步是在UIPageViewController 中构建缩放功能,以便用户可以通过捏合手势放大图像。
我通过以下代码实现了这一点:
- (void)viewDidLoad
{
[super viewDidLoad];
self.leafletImages = [NSMutableArray arrayWithObjects:[[ImageModel alloc] initWithImageName:@"3facts-chinese-page1.jpg"], [[ImageModel alloc] initWithImageName:@"3facts-chinese-page2.jpg"], [[ImageModel alloc] initWithImageName:@"3facts-chinese-page3.jpg"], [[ImageModel alloc] initWithImageName:@"3facts-chinese-page4.jpg"], [[ImageModel alloc] initWithImageName:@"3facts-chinese-page5.jpg"], [[ImageModel alloc] initWithImageName:@"3facts-chinese-page6.jpg"], nil];
// Lots of code for the building up of the UIPageViewController
LeafletImageSizeViewController *imageViewController = [[LeafletImageSizeViewController alloc] init];
imageViewController.model = [_modelArray objectAtIndex:0];
NSArray *viewControllers = [NSArray arrayWithObject:imageViewController];
[self.pageViewController setViewControllers:viewControllers
direction:UIPageViewControllerNavigationDirectionForward
animated:NO
completion:nil];
// Gesture
UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchDetected:)];
[self.view addGestureRecognizer:pinchRecognizer];
pinchRecognizer.delegate=self;
}
创建图像的类和大小是:
- (void)useThreeFactsSize
CGRect insetFrame;
insetFrame = CGRectMake(310, 70, self.view.frame.size.width-615, self.view.frame.size.height-85);
_imageView = [[UIImageView alloc] initWithFrame:insetFrame];
[_imageView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
[_imageView setImage:[UIImage imageNamed:_model.imageName]];
[[self view] addSubview:_imageView];
[self.view setBackgroundColor:[UIColor clearColor]];
}
pinchDetection 方法是:
-(void)pinchDetected:(UIPinchGestureRecognizer *)pinchRecognizer
{
CGFloat scale = pinchRecognizer.scale;
self.pageViewController.view.transform = CGAffineTransformScale(self.pageViewController.view.transform, scale, scale);
pinchRecognizer.scale = 1.0;
}
现在,我可以毫无问题地放大UIPageViewController 的图像,而且效果非常好。
然而,我想做的是两件事:
不允许将图像缩小到超出原始比例
创建双击手势以将图像恢复到原来的比例
使用功能1,用户可以放大图像,也可以完全缩小图像,缩小图像和UIPageViewControllerpageIndicators。用户没有理由可以缩小图像,所以我想允许用户放大到任何比例,但不要缩小到超过@987654330 屏幕上图像的原始大小@。
使用功能 2,我想实现一个手势来双击屏幕并让缩放后的图像恢复到原来的比例(如 Photos.app)。
更新
参考答案,我更新了问题以反映我将如何处理图像。使用第 2 点和双击手势,以下代码几乎可以工作:
- (void)scrollViewTwoFingerTapped:(UITapGestureRecognizer *)recognizer
{
NSLog(@"Double Tap");
self.pageViewController.view.transform = CGAffineTransformIdentity;
}
它目前正在做的是,如果我用捏合和平移放大,然后双击,它会将图像居中到我点击的位置,所以有时会显示边框等,而不是制作图像中心到它应该在的位置。
对于第 1 点:
if (pinchRecognizer.scale > 1) {
CGFloat scale = pinchRecognizer.scale;
self.pageViewController.view.transform = CGAffineTransformScale(self.pageViewController.view.transform, scale, scale);
pinchRecognizer.scale = 1.0;
}
如果我有 self.imageview,它不起作用,因为它是 nil,即使我调用设置大小的类,它也是 nil。
我怀疑我的代码有很多问题!
作为参考,我正在使用平移:
- (void)panGestureDetected:(UIPanGestureRecognizer *)recognizer
{
UIGestureRecognizerState state = [recognizer state];
if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
{
CGPoint translation = [recognizer translationInView:recognizer.view];
[recognizer.view setTransform:CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y)];
[recognizer setTranslation:CGPointZero inView:recognizer.view];
}
else if(state==UIGestureRecognizerStateEnded){
UIView *imageView = recognizer.view;
UIView *container = imageView.superview;
CGFloat targetX = CGRectGetMinX(imageView.frame);
CGFloat targetY = CGRectGetMinY(imageView.frame);
if(targetX>0){
// targetX = 0;
}else if(CGRectGetMaxX(imageView.frame)<CGRectGetWidth(container.bounds)){
targetX = CGRectGetWidth(container.bounds)-CGRectGetWidth(imageView.frame);
}
if(targetY>0){
// targetY = 0;
}else if(CGRectGetMaxY(imageView.frame)<CGRectGetHeight(container.bounds)){
// targetY = CGRectGetHeight(container.bounds)-CGRectGetHeight(imageView.frame);
}
// imageView.frame = CGRectMake(targetX, targetY, CGRectGetWidth(imageView.frame), CGRectGetHeight(imageView.frame));
[UIView animateWithDuration:0.3 animations:^{
imageView.frame = CGRectMake(targetX, targetY, CGRectGetWidth(imageView.frame), CGRectGetHeight(imageView.frame));
}];
}
}
目前效果很好,但肯定会与其他所有内容发生冲突。
我真的很感激任何关于这方面正确方向的指导。
【问题讨论】:
标签: ios objective-c iphone uiimage uipageviewcontroller