こんにちはー
今日は昨日の続きです.
昨日はOpenボタンを作りましたね.
昨日試したときにはどうやらOpenボタンの先が作られてなかったみたいなので
今日は続きをやっていこうとおもいます.
今日はInterface Builderを使いません.
ImageViewerViewController.hを次のようにします.
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
#import
@class ImageViewerView;
@interface ImageViewerViewController :
UIViewController
<
UIActionSheetDelegate,
UIImagePickerControllerDelegate,
UINavigationControllerDelegate
>
{
UIToolbar *_toolbar;
UIScrollView *_scrollView;
ImageViewerView *_imageView;
BOOL _fit;
}
@property (retain, nonatomic) IBOutlet UIToolbar *toolbar;
@property (retain, nonatomic) IBOutlet UIScrollView *scrollView;
@property (retain, nonatomic) IBOutlet ImageViewerView *imageView;
@property (getter=isFit) BOOL fit;
- (IBAction)openImage:(id)sender;
- (CGSize)calcMinimumViewSize;
- (float)calcMinimumZoomScale;
- (void)makeFit:(BOOL)isFit;
- (void)updateZoomScale;
- (void)updateFrameWithScale:(float)scale;
@end
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
次にImageViewerViewController.mを次のようにします.
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
#import "ImageViewerViewController.h"
#import "ImageViewerView.h"
static NSString *kSampleImageFileName = @"SampleImage.jpg";
static NSString *kPhotoLibrary = @"PhotoLibrary";
static NSString *kCancel = @"Cancel";
static const float kMaximumZoomScale = 2.0f;
@implementation ImageViewerViewController
@synthesize scrollView = _scrollView;
@synthesize imageView = _imageView;
@synthesize fit = _fit;
@synthesize toolbar = _toolbar;
- (void)dealloc
{
[_toolbar release];
[_scrollView release];
[_imageView release];
[super dealloc];
}
// Nibファイルからロード完了時に呼ばれるメソッド
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage *image = [UIImage imageNamed:kSampleImageFileName];
[self.imageView setImage:image];
[self updateZoomScale];
[self makeFit:YES];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
- (IBAction)openImage:(id)sender
{
UIActionSheet *sheet;
NSString *cancelStr = NSLocalizedString(kCancel, @"");
NSString *photoLibraryStr = NSLocalizedString(kPhotoLibrary, "");
sheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:cancelStr
destructiveButtonTitle:nil
otherButtonTitles:nil];
if ([UIImagePickerController isSourceTypeAvailable:
UIImagePickerControllerSourceTypePhotoLibrary])
{
[sheet addButtonWithTitle:photoLibraryStr];
}
[sheet showFromToolbar:[self toolbar]];
[sheet release];
}
- (void)actionSheet:(UIActionSheet *)actionSheet
clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != 0)
{
UIImagePickerController *picker;
picker = [[UIImagePickerController alloc] init];
picker.sourceType =
UIImagePickerControllerSourceTypePhotoLibrary;
picker.delegate = self;
[self presentModalViewController:picker
animated:YES];
}
}
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *img;
img = [info objectForKey:UIImagePickerControllerOriginalImage];
[self.imageView setImage:img];
[self updateZoomScale];
[self makeFit:YES];
[self.imageView setNeedsDisplay];
[picker dismissModalViewControllerAnimated:YES];
}
- (CGSize)calcMinimumViewSize
{
// return self.scrollView.frame.size;
CGSize scrollViewSize = self.scrollView.frame.size;
CGSize toolbarSize = self.toolbar.frame.size;
return CGSizeMake(scrollViewSize.width,
scrollViewSize.height - toolbarSize.height);
}
- (float)calcMinimumZoomScale
{
UIImage *image = self.imageView.image;
if (!image)
{
return 1.0f;
}
CGSize imageSize = image.size;
CGSize minViewSize = [self calcMinimumViewSize];
float scaleX = minViewSize.width / imageSize.width;
float scaleY = minViewSize.height / imageSize.height;
return (scaleX < scaleY ? scaleX : scaleY);
}
- (void)makeFit:(BOOL)isFit
{
if (isFit)
{
self.scrollView.zoomScale = [self calcMinimumZoomScale];
CGRect newFrame;
newFrame.origin = CGPointMake(0, 0);
newFrame.size = [self calcMinimumViewSize];
[self.imageView setFrame:newFrame];
[self.scrollView setContentSize:newFrame.size];
UIViewAutoresizing newMask;
newMask = (UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleHeight);
[self.imageView setAutoresizingMask:newMask];
}
else
{
UIViewAutoresizing newMask;
newMask = (UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleBottomMargin);
[self.imageView setAutoresizingMask:newMask];
}
[self setFit:isFit];
}
- (void)updateZoomScale
{
float f = [self calcMinimumZoomScale];
if (f > 1.0f) f = 1.0f;
[self.scrollView setMaximumZoomScale:kMaximumZoomScale];
[self.scrollView setMinimumZoomScale:f];
}
- (void)updateFrameWithScale:(float)scale
{
if (scale == self.scrollView.minimumZoomScale)
{
[self makeFit:YES];
}
else
{
if (self.isFit)
{
[self makeFit:NO];
}
UIImage *image = self.imageView.image;
if (!image)
return;
CGSize imageSize = image.size;
imageSize = CGSizeMake(round(imageSize.width * scale),
round(imageSize.height * scale));
CGSize minSize = [self calcMinimumViewSize];
if (imageSize.width < minSize.width)
imageSize.width = minSize.width;
if (imageSize.height < minSize.height)
imageSize.height = minSize.height;
CGRect newFrame;
newFrame.origin = CGPointMake(0, 0);
newFrame.size = imageSize;
[self.imageView setFrame:newFrame];
[self.scrollView setContentSize:newFrame.size];
}
}
- (void)didRotateFromInterfaceOrientation:
(UIInterfaceOrientation)orientation
{
[super didRotateFromInterfaceOrientation:orientation];
[self updateZoomScale];
if (self.isFit)
{
[self makeFit:YES];
}
else
{
[self updateFrameWithScale:self.scrollView.zoomScale];
}
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.imageView;
}
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView
withView:(UIView *)view
atScale:(float)scale
{
[self updateFrameWithScale:scale];
}
@end
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
ここまでできたら保存してビルトと実行してみます.
できました!
本に書いてあるとおりに一度組み立ててからここを換えたらどうなるかな?とかいろいろ試行錯誤してみるのもおもしろいですね.
ではでは今日はこのへんでー
あでゆー
今日は昨日の続きです.
昨日はOpenボタンを作りましたね.
昨日試したときにはどうやらOpenボタンの先が作られてなかったみたいなので
今日は続きをやっていこうとおもいます.
今日はInterface Builderを使いません.
ImageViewerViewController.hを次のようにします.
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
#import
@class ImageViewerView;
@interface ImageViewerViewController :
UIViewController
<
UIActionSheetDelegate,
UIImagePickerControllerDelegate,
UINavigationControllerDelegate
>
{
UIToolbar *_toolbar;
UIScrollView *_scrollView;
ImageViewerView *_imageView;
BOOL _fit;
}
@property (retain, nonatomic) IBOutlet UIToolbar *toolbar;
@property (retain, nonatomic) IBOutlet UIScrollView *scrollView;
@property (retain, nonatomic) IBOutlet ImageViewerView *imageView;
@property (getter=isFit) BOOL fit;
- (IBAction)openImage:(id)sender;
- (CGSize)calcMinimumViewSize;
- (float)calcMinimumZoomScale;
- (void)makeFit:(BOOL)isFit;
- (void)updateZoomScale;
- (void)updateFrameWithScale:(float)scale;
@end
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
次にImageViewerViewController.mを次のようにします.
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
#import "ImageViewerViewController.h"
#import "ImageViewerView.h"
static NSString *kSampleImageFileName = @"SampleImage.jpg";
static NSString *kPhotoLibrary = @"PhotoLibrary";
static NSString *kCancel = @"Cancel";
static const float kMaximumZoomScale = 2.0f;
@implementation ImageViewerViewController
@synthesize scrollView = _scrollView;
@synthesize imageView = _imageView;
@synthesize fit = _fit;
@synthesize toolbar = _toolbar;
- (void)dealloc
{
[_toolbar release];
[_scrollView release];
[_imageView release];
[super dealloc];
}
// Nibファイルからロード完了時に呼ばれるメソッド
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage *image = [UIImage imageNamed:kSampleImageFileName];
[self.imageView setImage:image];
[self updateZoomScale];
[self makeFit:YES];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
- (IBAction)openImage:(id)sender
{
UIActionSheet *sheet;
NSString *cancelStr = NSLocalizedString(kCancel, @"");
NSString *photoLibraryStr = NSLocalizedString(kPhotoLibrary, "");
sheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:cancelStr
destructiveButtonTitle:nil
otherButtonTitles:nil];
if ([UIImagePickerController isSourceTypeAvailable:
UIImagePickerControllerSourceTypePhotoLibrary])
{
[sheet addButtonWithTitle:photoLibraryStr];
}
[sheet showFromToolbar:[self toolbar]];
[sheet release];
}
- (void)actionSheet:(UIActionSheet *)actionSheet
clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != 0)
{
UIImagePickerController *picker;
picker = [[UIImagePickerController alloc] init];
picker.sourceType =
UIImagePickerControllerSourceTypePhotoLibrary;
picker.delegate = self;
[self presentModalViewController:picker
animated:YES];
}
}
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *img;
img = [info objectForKey:UIImagePickerControllerOriginalImage];
[self.imageView setImage:img];
[self updateZoomScale];
[self makeFit:YES];
[self.imageView setNeedsDisplay];
[picker dismissModalViewControllerAnimated:YES];
}
- (CGSize)calcMinimumViewSize
{
// return self.scrollView.frame.size;
CGSize scrollViewSize = self.scrollView.frame.size;
CGSize toolbarSize = self.toolbar.frame.size;
return CGSizeMake(scrollViewSize.width,
scrollViewSize.height - toolbarSize.height);
}
- (float)calcMinimumZoomScale
{
UIImage *image = self.imageView.image;
if (!image)
{
return 1.0f;
}
CGSize imageSize = image.size;
CGSize minViewSize = [self calcMinimumViewSize];
float scaleX = minViewSize.width / imageSize.width;
float scaleY = minViewSize.height / imageSize.height;
return (scaleX < scaleY ? scaleX : scaleY);
}
- (void)makeFit:(BOOL)isFit
{
if (isFit)
{
self.scrollView.zoomScale = [self calcMinimumZoomScale];
CGRect newFrame;
newFrame.origin = CGPointMake(0, 0);
newFrame.size = [self calcMinimumViewSize];
[self.imageView setFrame:newFrame];
[self.scrollView setContentSize:newFrame.size];
UIViewAutoresizing newMask;
newMask = (UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleHeight);
[self.imageView setAutoresizingMask:newMask];
}
else
{
UIViewAutoresizing newMask;
newMask = (UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleBottomMargin);
[self.imageView setAutoresizingMask:newMask];
}
[self setFit:isFit];
}
- (void)updateZoomScale
{
float f = [self calcMinimumZoomScale];
if (f > 1.0f) f = 1.0f;
[self.scrollView setMaximumZoomScale:kMaximumZoomScale];
[self.scrollView setMinimumZoomScale:f];
}
- (void)updateFrameWithScale:(float)scale
{
if (scale == self.scrollView.minimumZoomScale)
{
[self makeFit:YES];
}
else
{
if (self.isFit)
{
[self makeFit:NO];
}
UIImage *image = self.imageView.image;
if (!image)
return;
CGSize imageSize = image.size;
imageSize = CGSizeMake(round(imageSize.width * scale),
round(imageSize.height * scale));
CGSize minSize = [self calcMinimumViewSize];
if (imageSize.width < minSize.width)
imageSize.width = minSize.width;
if (imageSize.height < minSize.height)
imageSize.height = minSize.height;
CGRect newFrame;
newFrame.origin = CGPointMake(0, 0);
newFrame.size = imageSize;
[self.imageView setFrame:newFrame];
[self.scrollView setContentSize:newFrame.size];
}
}
- (void)didRotateFromInterfaceOrientation:
(UIInterfaceOrientation)orientation
{
[super didRotateFromInterfaceOrientation:orientation];
[self updateZoomScale];
if (self.isFit)
{
[self makeFit:YES];
}
else
{
[self updateFrameWithScale:self.scrollView.zoomScale];
}
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.imageView;
}
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView
withView:(UIView *)view
atScale:(float)scale
{
[self updateFrameWithScale:scale];
}
@end
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
ここまでできたら保存してビルトと実行してみます.
できました!
本に書いてあるとおりに一度組み立ててからここを換えたらどうなるかな?とかいろいろ試行錯誤してみるのもおもしろいですね.
ではでは今日はこのへんでー
あでゆー
















