2009-04-27 15 views
19

Uygulamamda, kullanıcılara Fotoğraf uygulamasında kullanılana benzeyen bir tam ekran fotoğraf görüntüleyici sunmak istiyorum. Bu sadece tek bir fotoğraf içindir ve bu nedenle oldukça basit olmalıdır. Ben sadece kullanıcının bu bir fotoğrafı, yakınlaştırma ve kaydırma kabiliyeti ile görüntüleyebilmesini istiyorum.UIImageView'ı tam ekran UIScrollView içine nasıl yerleştiririm?

Çoğu çalışıyorum. Ve eğer UIImageView'imi ortalamıyorsam, her şey mükemmel davranır. Ancak, UIImageView'ın görüntü yeterince büyütülmüş olduğunda ekranda ortalanmasını gerçekten istiyorum. Kaydırma görünümünün sol üst köşesine yapışmasını istemiyorum.

Bu görünümü ortalamayı denediğimde, dikey kaydırılabilir alanım olması gerekenden daha büyük görünüyor. Bu nedenle, bir kez yakınlaştırdığımda, resmin üstünden yaklaşık 100 piksel kaydırmayı başarabiliyorum. Neyi yanlış yapıyorum?

@interface MyPhotoViewController : UIViewController <UIScrollViewDelegate> 
{ 
    UIImage* photo; 
    UIImageView *imageView; 
} 
- (id)initWithPhoto:(UIImage *)aPhoto; 
@end 

@implementation MyPhotoViewController 

- (id)initWithPhoto:(UIImage *)aPhoto 
{ 
    if (self = [super init]) 
    { 
     photo = [aPhoto retain]; 

     // Some 3.0 SDK code here to ensure this view has a full-screen 
     // layout. 
    } 

    return self; 
} 

- (void)dealloc 
{ 
    [photo release]; 
    [imageView release]; 
    [super dealloc]; 
} 

- (void)loadView 
{ 
    // Set the main view of this UIViewController to be a UIScrollView. 
    UIScrollView *scrollView = [[UIScrollView alloc] init]; 
    [self setView:scrollView]; 
    [scrollView release]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Initialize the scroll view. 
    CGSize photoSize = [photo size]; 
    UIScrollView *scrollView = (UIScrollView *)[self view]; 
    [scrollView setDelegate:self]; 
    [scrollView setBackgroundColor:[UIColor blackColor]]; 

    // Create the image view. We push the origin to (0, -44) to ensure 
    // that this view displays behind the navigation bar. 
    imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, -44.0, 
     photoSize.width, photoSize.height)]; 
    [imageView setImage:photo]; 
    [scrollView addSubview:imageView]; 

    // Configure zooming. 
    CGSize screenSize = [[UIScreen mainScreen] bounds].size; 
    CGFloat widthRatio = screenSize.width/photoSize.width; 
    CGFloat heightRatio = screenSize.height/photoSize.height; 
    CGFloat initialZoom = (widthRatio > heightRatio) ? heightRatio : widthRatio; 
    [scrollView setMaximumZoomScale:3.0]; 
    [scrollView setMinimumZoomScale:initialZoom]; 
    [scrollView setZoomScale:initialZoom]; 
    [scrollView setBouncesZoom:YES]; 
    [scrollView setContentSize:CGSizeMake(photoSize.width * initialZoom, 
     photoSize.height * initialZoom)]; 

    // Center the photo. Again we push the center point up by 44 pixels 
    // to account for the translucent navigation bar. 
    CGPoint scrollCenter = [scrollView center]; 
    [imageView setCenter:CGPointMake(scrollCenter.x, 
     scrollCenter.y - 44.0)]; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [[[self navigationController] navigationBar] setBarStyle:UIBarStyleBlackTranslucent]; 
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [[[self navigationController] navigationBar] setBarStyle:UIBarStyleDefault]; 
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; 
} 

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

@end 
+0

o setZoomScale çağrı nedir? ZoomScrollView'umu kullanıyor musunuz? –

cevap

26

(belgelerine)

.

Apple WWDC code for PhotoScroller temel alınmıştır.

UIScrollView sizin alt sınıf için aşağıdaki ekleyin ve resim veya fayans içeren görüntüsü tileContainerView değiştirin:

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    // center the image as it becomes smaller than the size of the screen 
    CGSize boundsSize = self.bounds.size; 
    CGRect frameToCenter = tileContainerView.frame; 

    // center horizontally 
    if (frameToCenter.size.width < boundsSize.width) 
     frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width)/2; 
    else 
     frameToCenter.origin.x = 0; 

    // center vertically 
    if (frameToCenter.size.height < boundsSize.height) 
     frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height)/2; 
    else 
     frameToCenter.origin.y = 0; 

    tileContainerView.frame = frameToCenter; 
} 
+1

Güzel, bir tedavi gördü. – kim3er

+0

Bu mükemmel çalışıyor ve her zaman kullanıyorum. – bentford

+0

thx mükemmel bir şekilde çalışıyor: D –

-1

Muhtemelen o zaman görüntü görüntüsü sınırları ve bunun içeren görünümünde kaydırma görünümünü ortalamak = kaydırma görünümün sınırları ayarlamak istiyoruz. Üstteki bir ofsetde kaydırma görünümü içine bir görünüm yerleştirirseniz, bunun üstündeki boş alanı alırsınız.

+0

Teşekkürler, ama bu herhangi bir fark yaratmıyor gibi görünüyor. Arama [scrollView setBounds: [imageView bounds]]; görüntü, ekranın tüm dikey alanını kapladığında bile yukarı ve aşağı kaydırmamı sağlar. –

1

Kaydırma görünümünü eklemek için IB kullanıyor musunuz? Kaydırma görünümünün otomatik boyutlandırma seçeneklerini ekli görüntüye değiştirin. alt text http://img527.imageshack.us/img527/1607/picture1mqc.th.png

+0

UIScrollView eklemek için IB kullanmıyorum. Ancak, kaydırma görünümünün boyutunun doğru olduğunu düşünüyorum. Kaydırma görünümümün arka plan rengini mor olarak değiştirdiğimde, bunun her zaman ekranın tamamını kapladığını görebiliyorum. –

0

Bu sorunu çözebildiniz mi? Benzer bir sorunla uğraştım. Bence bunun sebebi, zoomScale'in scrollView içindeki alt görüntünün gerçek boyutuna bakılmaksızın tüm contentSize için geçerli olmasıdır (sizin durumunuzda bir imageView). ContentSize yüksekliği, scrollView çerçevesinin yüksekliğinden her zaman eşit veya daha büyük görünüyor, ancak asla daha küçük değil. Bu nedenle, yakınlaştırmayı uygularken, contentSize'in yüksekliği, zoomScale faktörü ile çarpılır, bu yüzden dikey kaydırma için fazladan 100'lük bir piksel elde edersiniz.

2

UIViewAçıklama seçeneklerini kontrol ettiniz mi? Bu kod, IOS en sürümlerinde çalışır (yukarı doğru 3.1 üzerinde çalışmak için test edilmiştir)

UIViewAutoresizing 
Specifies how a view is automatically resized. 

enum { 
    UIViewAutoresizingNone     = 0, 
    UIViewAutoresizingFlexibleLeftMargin = 1 << 0, 
    UIViewAutoresizingFlexibleWidth  = 1 << 1, 
    UIViewAutoresizingFlexibleRightMargin = 1 << 2, 
    UIViewAutoresizingFlexibleTopMargin = 1 << 3, 
    UIViewAutoresizingFlexibleHeight  = 1 << 4, 
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5 
}; 
typedef NSUInteger UIViewAutoresizing;