如何在ScrollView(iPhone)中启用缩放功能

4

我有一段代码,想要修改以添加缩放功能。目前我的应用只能进行水平滚动,但无法进行缩放。

我感觉还有些遗漏,因为我尝试了使用“viewForZoomingInScrollView:”,但没有成功。请问如何实现缩放?

谢谢。

#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

以及实现:

#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)setSizeFromParentView:(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

请格式化你的代码。 - Nick Weaver
3个回答

2

你的viewForZoomingInScrollView实现在哪里?它返回什么?

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
    return yourViewToBeZoomed; // 
}

编辑:

好的,总体来说,使用这种方法时,您只需指定在用户使用广告移动两个手指在您的scrollView上滚动时需要滚动的内容...通常(但不总是)它是UIScrollView本身的第一个子视图...

所以,如果是您的情况,请尝试此代码:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
    return [scrollView2.subviews objectAtIndex:0];
}

如果您添加了更多的子视图并且想要对它们进行缩放,最好将它们添加到第一个子视图而不是直接添加到UIScrollView中,这样它们会随着第一个子视图一起缩放...

你好,

卢卡


@andrea:顺便问一下,你的类中所有其他<UIScrollViewDelegate>方法都被调用了吗(例如scrollViewDidEndDecelerating)? - meronix
好的,我看到了第一个答案并且放置了这段代码,但是仍然不起作用。在这里我声明了以下方法:`- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView2;
  • (void)scrollViewDidEndZooming:(UIScrollView *)scrollView2 withView:(UIView *)view atScale:(float)scale; 并且在这里我调用了这些方法:- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView2 { NSLog(@"zoom"); return [scrollView2.subviews objectAtIndex:0]; }
  • (void)scrollViewDidEndZooming:(UIScrollView *)scrollView2 withView:(UIView *)view atScale:(float)scale { [scrollView2 setZoomScale:1 animated:NO]; }`
- Andrea Bianchi
邮件没有起作用,我调用了所有的委托方法但仍然不起作用。我计划做一个像Photoscroller Apple示例中的ScrollView,但不需要平铺。但那段代码很长... - Andrea Bianchi
一个相册视图,那么?嗯,苹果的示例“Photoscroller”是为了缩放非常大的照片而完成的,这就是为什么它们被平铺(并且有更多的详细级别)...但如果你不想要平铺,只是一个带有更多交换照片和可能缩放屏幕上照片的相册,还有其他的样本/免费代码可用:最常用的是Three20,只需在这里或google/github.com搜索它(它是FaceBook应用程序中使用的相册代码)。或者尝试这个(这是我喜欢的),更容易使用:https://github.com/mwaterfall/MWPhotoBrowser ... 再见 - meronix
那对我有用,今晚我已经完成了代码,现在我将我的代码和答案一起放上去。 - Andrea Bianchi
显示剩余11条评论

0

好的,那个Photoscroller苹果示例确实起作用了,它也使用了Tiling,但您可以禁用它(完全或仅禁用白线)。 它还支持旋转。

这里是您可以使用普通图像而不是平铺的地方:

- (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]];
}

如果你想使用平铺(用于大图像),但不想看到白线,这里是代码(在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;
}

0
你设置了maximumZoomScale吗?无论是在代码中还是在IB中...

是的,但我的问题是我创建了一个包含图像的数组,然后将该数组放在ViewDidLoad中。当我要使用此方法时,我将在哪个视图内使用?
  • (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return XXX }
- Andrea Bianchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接