2013-08-09 3 views
4

UIScrollView 내부에 UIImageView가있는 문제가 있습니다. Interface Builder에서 UIScrollView는 전체 화면을 차지하고 UIImageView는 전체 UIScrollView를 사용합니다. 문제는 가로 방향의 이미지가있을 때 가로 세로 맞춤으로 설정했기 때문에 위쪽과 아래쪽에 회색 막대가 나타납니다 (원하는 부분). 그러나 사진을 확대 할 때 사진이 화면 수직에 맞게 충분히 크게 확대되면 위의 회색 영역으로 이동하지 않도록합니다. 내가 첨부 한 스크린 샷을보십시오. 나는 기본적으로 그것이 그 점에서 포토 앱처럼 작동하기를 원한다. 사전에UIIcageView 내의 UIImageView가 너무 멀리 이동합니다.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
    self.imageView.image = [UIImage imageNamed:@"IMG_0300.JPG"]; 
    self.imageView.contentMode = UIViewContentModeScaleAspectFit; 
    self.scrollView.clipsToBounds = YES; 
    self.scrollView.contentSize = self.imageView.bounds.size; 
    self.scrollView.zoomScale = 1.0; 
    self.scrollView.maximumZoomScale = 5.0; 
    self.scrollView.minimumZoomScale = 1.0; 

} 

-(void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

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

See how it pans too far up

감사 : 여기에있는 UIScrollView을 설정하고 UIImageView에 대한 내 코드입니다.

야곱은

답변

10

그것은의 이미지뿐만 아니라 회색 막대뿐만 아니라 확대 된 전체 UIImageView입니다. scrollView는 정직하게이를 반영합니다. 아마 당신은 원하는 결과는 다음과 같이 수행 할 수 있습니다

"상단과 하단에 회색 막대가"보다는
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    UIImage *image = [UIImage imageNamed:@"IMG_0300.JPG"]; 
    CGFloat ratio = CGRectGetWidth(self.scrollView.bounds)/image.size.width; 
    self.imageView.bounds = CGRectMake(0, 0, CGRectGetWidth(self.scrollView.bounds), image.size.height * ratio); 
    self.imageView.center = CGPointMake(CGRectGetMidX(self.scrollView.bounds), CGRectGetMidY(self.scrollView.bounds)); 
    self.imageView.image = image; 
    self.scrollView.clipsToBounds = YES; 
    self.scrollView.contentSize = self.imageView.bounds.size; 
    self.scrollView.zoomScale = 1.0; 
    self.scrollView.maximumZoomScale = 10.0; 
    self.scrollView.minimumZoomScale = 1.0; 

} 

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 
{ 
    UIView *subView = self.imageView; 
    CGFloat offsetX = (scrollView.bounds.size.width > scrollView.contentSize.width)? 
    (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5 : 0.0; 

    CGFloat offsetY = (scrollView.bounds.size.height > scrollView.contentSize.height)? 
    (scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5 : 0.0; 

    subView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX, 
           scrollView.contentSize.height * 0.5 + offsetY); 
} 

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return self.imageView; 
} 
+0

덕분에,이 대답은 내가 –

+0

우수함 :) 수 있다면 나는 두 번을 받아 들일 것 너무 좋다. 감사 . – sajwan

+0

당신의 코드를 구현하고 viewDidAppear : 애니메이션을 적용한 UIImageView 경계가 스토리 보드에 선언 된 크기로 되돌아갑니다. 이것을 유발할 수있는 단서가 있습니까? –

0

은 회색하는 UIScrollView의 배경색을 설정합니다.

또한 서브 뷰가 아직 배치되지 않았으므로 viewDidLoad의 뷰 치수를 사용하지 마십시오. didLayoutSubviews 또는 viewWillAppear으로 이동하십시오. 또한 최대 확대/축소를 기준으로 UIScrollViewcontentSize을 설정하십시오. 예를 들어 :

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 

    self.scrollView.backgroundColor = [UIColor lightGrayColor]; // or other color 
    CGFloat maxScale = 5.0; 
    self.scrollView.zoomScale = 1.0; 
    self.scrollView.maximumZoomScale = maxScale; 
    self.scrollView.minimumZoomScale = 1.0; 
    CGSize contentSize = CGSizeMake(self.scrollView.bounds.size.width * maxScale, self.scrollView.bounds.size.height * maxScale); 
    self.scrollView.contentSize = contentSize; 

    // ... 
} 
0

이 시도 :

UIView *subView = self.imageView; 
    CGFloat offsetX = (scrollView.bounds.size.width > scrollView.contentSize.width)? 
    (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5 : 0.0; 

    CGFloat offsetY = (scrollView.bounds.size.height > scrollView.contentSize.height)? 
    (scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5 : 0.0; 

    subView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX, 
           scrollView.contentSize.height * 0.5 + offsetY); 
관련 문제