How to enable Zooming in ScrollView (iPhone)
i have a code that i want to modify to get a zoom ability. Now my app only do an horizontal scroll but not a zoom.
i miss something, because i tried the "viewForZoomingInScrollView:" with no success. How can i get a zoom in this?
Thanks
#import <UIKit/UIKit.h>
@interface IntroductionViewController : UIViewController <UIScrollViewDelegate>{
IBOutlet UIScrollView *scrollView;
CGRect rectScrollView;
int scrollWidth;
int scrollHeight;
NSArray *contentArray;
UIColor *bcgColor;
BOOL rememberPosition;
NSString *positionIdentifier;
}
@property (nonatomic, retain) IBOutlet UIScrollView *scrollView;
/// returns width of the scollview
- (int)getScrollViewWidth;
/// set width and height for your final UIScrollView
- (void)setWidth:(int)width andHeight:(int)height;
/// set the exactly same size as it is your parent view
- (void)setSizeFromParentView:(UIScrollView *)scView;
/// set background color for your UIScrollView
- (void)setBackGroudColor:(UIColor *)color;
/// set an array with images you want to display in your new scroll view
- (void)setContentArray:(NSArray *)images;
/// enable position history
- (void)enablePositionMemory;
/// enable position history with custom memory identifier
- (void)enablePositionMemoryWithIdentifier:(NSString *)identifier;
/// returns your UIScrollView with predefined page
- (UIScrollView *)getWithPosition:(int)page;
/// returns your UIScrollView with enabled position history
- (UIScrollView *)getWithPositionMemory;
/// returns your UIScrollView with enabled position history with custom memory identifier
- (UIScrollView *)getWithPositionMemoryIdentifier:(NSString *)identifier;
/// returns your UIScrollView
- (UIScrollView *)get;
@end
and the implementation:
#import "IntroductionViewController.h"
#define kIGUIScrollViewImagePageIdentifier @"kIGUIScrollViewImagePageIdentifier"
#define kIGUIScrollViewImageDefaultPageIdentifier @"Default"
@implementation IntroductionViewController
@synthesize scrollView;
- (int)getScrollViewWidth {
return ([contentArray count] * scrollWidth);
}
- (void)setWidth:(int)width andHeight:(int)height {
scrollWidth = width;
scrollHeight = height;
if (!width || !height) rectScrollView = [[UIScreen mainScreen] applicationFrame];
else rectScrollView = CGRectMake(0, 0, width, height);
}
- (void)setSize开发者_如何学CFromParentView:(UIScrollView *)scView {
scrollWidth = scView.frame.size.width;
scrollHeight = scView.frame.size.height;
rectScrollView = CGRectMake(0, 0, scrollWidth, scrollHeight);
}
- (void)setContentArray:(NSArray *)images {
contentArray = images;
}
- (void)setBackGroudColor:(UIColor *)color {
bcgColor = color;
}
- (void)enablePositionMemoryWithIdentifier:(NSString *)identifier {
rememberPosition = NO;
if (!identifier) identifier = kIGUIScrollViewImageDefaultPageIdentifier;
positionIdentifier = identifier;
}
- (void)enablePositionMemory {
[self enablePositionMemoryWithIdentifier:nil];
}
- (UIScrollView *)getWithPosition:(int)page {
if (!contentArray) {
contentArray = [[[NSArray alloc] init] autorelease];
}
if (page > [contentArray count]) page = 0;
if (!scrollWidth || !scrollHeight) {
rectScrollView = [[UIScreen mainScreen] applicationFrame];
scrollWidth = rectScrollView.size.width;
scrollHeight = rectScrollView.size.height;
}
rectScrollView = CGRectMake(0, 0, scrollWidth, scrollHeight);
self.scrollView = [[UIScrollView alloc] initWithFrame:rectScrollView];
self.scrollView.contentSize = CGSizeMake([self getScrollViewWidth], scrollHeight);
if (!bcgColor) bcgColor = [UIColor blackColor];
self.scrollView.backgroundColor = bcgColor;
self.scrollView.alwaysBounceHorizontal = YES;
self.scrollView.contentOffset = CGPointMake(page * scrollWidth, 0);
self.scrollView.pagingEnabled = YES;
UIView *main = [[[UIView alloc] initWithFrame:rectScrollView] autorelease];
int i = 0;
for (UIImage *img in contentArray) {
UIImageView *imageView = [[UIImageView alloc] init];
imageView.image = img;
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
imageView.backgroundColor = [UIColor blackColor];
float ratio = img.size.width/rectScrollView.size.width;
CGRect imageFrame = CGRectMake(i, 0, rectScrollView.size.width, (img.size.height / ratio));
imageView.frame = imageFrame;
[self.scrollView addSubview:(UIView *)imageView];
i += scrollWidth;
[imageView release];
}
[main addSubview:scrollView];
//if (margin) [margin release];
[self.scrollView release];
[self.scrollView release];
return (UIScrollView *)main;
}
- (UIScrollView *)get {
return [self getWithPosition:0];
}
- (UIScrollView *)getWithPositionMemory {
[self enablePositionMemory];
return [self getWithPosition:[[[NSUserDefaults standardUserDefaults] objectForKey:[NSString stringWithFormat:@"%@%@", kIGUIScrollViewImagePageIdentifier, kIGUIScrollViewImageDefaultPageIdentifier]] intValue]];
}
- (UIScrollView *)getWithPositionMemoryIdentifier:(NSString *)identifier {
[self enablePositionMemoryWithIdentifier:identifier];
return [self getWithPosition:[[[NSUserDefaults standardUserDefaults] objectForKey:[NSString stringWithFormat:@"%@%@", kIGUIScrollViewImagePageIdentifier, positionIdentifier]] intValue]];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)sv {
int page = sv.contentOffset.x / sv.frame.size.width;
if (rememberPosition) {
[[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithFormat:@"%d", page] forKey:[NSString stringWithFormat:@"%@%@", kIGUIScrollViewImagePageIdentifier, positionIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
- (NSArray *)getImages {
NSMutableArray *arr = [[[NSMutableArray alloc] init] autorelease];
// codice per intercettare la lingua impostata dall utente
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [languages objectAtIndex:0];
NSLog(@"Codice lingua %@", currentLanguage);
if( [currentLanguage isEqualToString:@"es"] ){
[arr addObject:[UIImage imageNamed:@"image1-intro.jpg"]];
[arr addObject:[UIImage imageNamed:@"image2-intro.jpg"]];
[arr addObject:[UIImage imageNamed:@"image3-intro.jpg"]];
[arr addObject:[UIImage imageNamed:@"image4-intro.jpg"]];
[arr addObject:[UIImage imageNamed:@"image5-intro.jpg"]];
[arr addObject:[UIImage imageNamed:@"image6-intro.jpg"]];
return (NSArray *)arr;
}
else {
[arr addObject:[UIImage imageNamed:@"image1-intro.jpg"]];
[arr addObject:[UIImage imageNamed:@"image2-intro.jpg"]];
[arr addObject:[UIImage imageNamed:@"image3-intro.jpg"]];
[arr addObject:[UIImage imageNamed:@"image4-intro.jpg"]];
[arr addObject:[UIImage imageNamed:@"image5-intro.jpg"]];
return (NSArray *)arr;
}
}
/*
// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
// Custom initialization
}
return self;
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
//codice per mettere il titolo come immagine
UIImage *titolo = [UIImage imageNamed: @"introTitle.png"];
UIImageView *titoloView = [[UIImageView alloc] initWithImage: titolo];
self.navigationItem.titleView = titoloView;
IntroductionViewController *svimage = [[IntroductionViewController alloc] init];
[svimage setContentArray:[self getImages]];
[svimage setSizeFromParentView:scrollView];
[self.view addSubview:[svimage getWithPosition:0]];
[svimage release];
[titoloView release];
}
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
NSLog(@"memoria view");
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
and where is your implementation of viewForZoomingInScrollView? what does it return?
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
return yourViewToBeZoomed; //
}
EDIT:
ok, so, in general, with this method you just specify what you have to scroll when user use ad move 2 fingers on your scrollView... normally (but not always) it's the first subView of the UIScrollView itself...
so, if it's your case, just try this code:
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
return [scrollView2.subviews objectAtIndex:0];
}
and if you added more subView and want to zoom them too u'd better to add them NOT directly to your UIScrollView but to your first subView, so they will zoom with it...
ciao,
luca
Did you set maximumZoomScale? Either in code, or in IB…
That worked, the Photoscroller Apple example, it used also Tiling but you can disable that (competely or just disable the white lines). It also support the rotation.
here is where u can use normal images instead of tiled:
- (void)configurePage:(ImageScrollView *)page forIndex:(NSUInteger)index
{
page.index = index;
page.frame = [self frameForPageAtIndex:index];
// Use tiled images
/*
[page displayTiledImageNamed:[self imageNameAtIndex:index]
size:[self imageSizeAtIndex:index]];
*/
// To use full images instead of tiled images, replace the "displayTiledImageNamed:" call
// above by the following line:
[page displayImage:[self imageAtIndex:index]];
}
And if you want to use Tiling (for big images) but don't want to see the white lines here is the code (in the ImageScrollView):
- (void)displayTiledImageNamed:(NSString *)imageName size:(CGSize)imageSize
{
// clear the previous imageView
[imageView removeFromSuperview];
[imageView release];
imageView = nil;
// reset our zoomScale to 1.0 before doing any further calculations
self.zoomScale = 1.0;
// make a new TilingView for the new image
imageView = [[TilingView alloc] initWithImageName:imageName size:imageSize];
/*
[(TilingView *)imageView setAnnotates:YES]; // ** remove this line to remove the white tile grid **
*/
[self addSubview:imageView];
self.contentSize = imageSize;
[self setMaxMinZoomScalesForCurrentBounds];
self.zoomScale = self.minimumZoomScale;
}
精彩评论