Как включить масштабирование в ScrollView (iPhone) - PullRequest
4 голосов
/ 18 марта 2011

У меня есть код, который я хочу изменить, чтобы получить возможность масштабирования.Теперь мое приложение выполняет только горизонтальную прокрутку, но не масштабирование.

Я что-то пропустил, потому что я попытался «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

Ответы [ 3 ]

2 голосов
/ 18 марта 2011

а где ваша реализация viewForZoomingInScrollView? что это возвращает?

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

EDIT:

хорошо, так что, в общем, с помощью этого метода вы просто указываете, что вы должны прокручивать, когда пользователь использует объявление, перемещая два пальца на вашем scrollView ... обычно (но не всегда) это первый подвид самого UIScrollView .. .

так что, если это ваш случай, просто попробуйте этот код:

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

и если вы добавили больше подпредставления и хотите увеличить их тоже, лучше добавить их НЕ непосредственно в ваш UIScrollView, а в ваш первый подпросмотр, чтобы они масштабировались вместе с ним ...

чао,

Luca

0 голосов
/ 19 марта 2011

Это сработало, например, на Photoscroller Apple, он также использовал 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]];
}

И если вы хотите использовать Tiling (для больших изображений), но не хотитечтобы увидеть белые линии, вот код (в 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 голосов
/ 18 марта 2011

Вы установили максимум ZoomScale? Либо в коде, либо в IB…

...