ピンチを機能させるには、UIScrollView内にUIPinchGestureRecognizerが実際に必要ですか?はいの場合、どうすればいいですか?私はフリップボードが持っているものを実装しようとしています。それは基本的に画像をズームインし、ズームイン後にスクロール機能を持っています。どうすればいいですか?
更新:
以下に、スクロールビューデリゲートを呼び出さないコードをいくつか示します。
CGRect imgFrame;
imgFrame.size.width = originalImageSize.width;
imgFrame.size.height = originalImageSize.height;
imgFrame.Origin.x = imageOriginPoint.x;
imgFrame.Origin.y = imageOriginPoint.y;
NSData *data = [request responseData];
UIImage * image = [UIImage imageWithData:data];
imageView = [[UIImageView alloc] initWithImage:image];
[imageView setUserInteractionEnabled:YES];
[imageView setBackgroundColor:[UIColor clearColor]];
[imageView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
[imageView setFrame:CGRectMake(0, 0, imgFrame.size.width, imgFrame.size.height)];
UIScrollView * imgScrollView = [[UIScrollView alloc] initWithFrame:imageView.frame];
imgScrollView.delegate = self;
imgScrollView.showsVerticalScrollIndicator = NO;
imgScrollView.showsHorizontalScrollIndicator = NO;
[imgScrollView setScrollEnabled:YES];
[imgScrollView setClipsToBounds:YES];
[imgScrollView addSubview:imageView];
[imgScrollView setBackgroundColor:[UIColor blueColor]];
[imgScrollView setMaximumZoomScale:1.0];
必要なことは、UIImageView
(またはズームしたいビュー)をUIScrollView
内に追加することだけです。
maximumZoomScale
のUIScrollView
を1.0fより高い値に設定します。
自分をUIScrollView
のデリゲートとして設定し、viewForZoomingデリゲートメソッドでUIImageView
を返します。
それでおしまい。ピンチジェスチャーは必要ありません。 UIScrollView
は、ピンチズームを処理します。
目的C
Scrollviewステップのピンチズーム画像(目的C)
1。スクロールビューの制約
2。 ScrollViewにImageViewを追加し、Constraintsを設定します
3。 IBOutletsを取る
IBOutlet UIScrollView * bgScrollView;
IBOutlet UIImageView * imageViewOutlet;
4。 viewDidLoadメソッド
- (void)viewDidLoad
{
[super viewDidLoad];
float minScale=bgScrollView.frame.size.width / imageViewOutlet.frame.size.width;
bgScrollView.minimumZoomScale = minScale;
bgScrollView.maximumZoomScale = 3.0;
bgScrollView.contentSize = imageViewOutlet.frame.size;
bgScrollView.delegate = self;
}
5。スクロールビューのデリゲートメソッド
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return imageViewOutlet;
}
Swift
Scrollviewステップのピンチズーム画像(Swift)
1。スクロールビューの制約
2。 ScrollViewにImageViewを追加し、Constraintsを設定します
3。 IBOutletsを取る
@IBOutlet weak var bgScrollView : UIScrollView!
@IBOutlet weak var imageView : UIImageView!
4。 viewDidLoadメソッド
override func viewDidLoad() {
super.viewDidLoad()
let minScale = bgScrollView.frame.size.width / imageView.frame.size.width;
bgScrollView.minimumZoomScale = minScale
bgScrollView.maximumZoomScale = 3.0
bgScrollView.contentSize = imageView.frame.size
bgScrollView.delegate = self
}
5。スクロールビューのデリゲートメソッド
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return imageView
}
ピンチレコグナイザーなしでカスタムイメージビューアーを作成したのは、少し前のことです。 UIScrollViewの上にあるUIImageViewだけ。そこで、画像へのリンクを含む文字列を渡します。また、進行状況バーもあります。その画像の読み込みが完了すると、画像が表示されます。コードは次のとおりです。
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.theImageView;
}
- (CGRect)centeredFrameForScrollView:(UIScrollView *)scroll andUIView:(UIView *)rView {
CGSize boundsSize = scroll.bounds.size;
CGRect frameToCenter = rView.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;
}
return frameToCenter;
}
-(void)scrollViewDidZoom:(UIScrollView *)scrollView
{
self.theImageView.frame = [self centeredFrameForScrollView:self.theScrollView andUIView:self.theImageView];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[self.resourceData setLength:0];
self.filesize = [NSNumber numberWithLongLong:[response expectedContentLength]];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[self.resourceData appendData:data];
NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[self.resourceData length]];
self.progressBar.progress = [resourceLength floatValue] / [self.filesize floatValue];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
self.theImage = [[UIImage alloc]initWithData:resourceData];
self.theImageView.frame = CGRectMake(0, 0, self.theImage.size.width, self.theImage.size.height);
self.theImageView.image = self.theImage;
self.theScrollView.minimumZoomScale = self.theScrollView.frame.size.width / self.theImageView.frame.size.width;
self.theScrollView.maximumZoomScale = 2.0;
[self.theScrollView setZoomScale:self.theScrollView.minimumZoomScale];
self.theScrollView.contentSize = self.theImageView.frame.size;
self.theLabel.hidden = YES;
self.progressBar.hidden = YES;
}
-(void)setImageInImageView
{
NSURLRequest *req = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:self.imageLink]];
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:req delegate:self];
if (conn)
{
self.resourceData = [NSMutableData data];
}
else
{
NSLog(@"Connection failed: IMageViewerViewController");
}
}
-(void)loadView
{
self.filesize = [[NSNumber alloc]init];
self.progressBar = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleBar];
self.progressBar.frame = CGRectMake(20, 240, 280, 40);
[self.progressBar setProgress:0.0];
self.theImageView = [[[UIImageView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame]]autorelease];
self.theScrollView = [[[UIScrollView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame]]autorelease];
self.theScrollView.delegate = self;
[self.theScrollView addSubview:self.theImageView];
self.view = self.theScrollView;
self.theLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 200, 320, 40)];
self.theLabel.font = [UIFont boldSystemFontOfSize:15.0f];
self.theLabel.text = @"Please wait, file is being downloaded";
self.theLabel.textAlignment = UITextAlignmentCenter;
self.theLabel.hidden = NO;
[self.view addSubview:self.progressBar];
[self.view bringSubviewToFront:self.progressBar];
[self.view addSubview:self.theLabel];
[self.view bringSubviewToFront:self. theLabel];
[self performSelectorOnMainThread:@selector(setImageInImageView) withObject:nil waitUntilDone:NO];
}
そしてヘッダーファイル:
@interface ImageViewerViewController : UIViewController<UIScrollViewDelegate, NSURLConnectionDelegate, NSURLConnectionDataDelegate>
@property (nonatomic, retain) IBOutlet UIImageView *theImageView;
@property (nonatomic, retain) IBOutlet UIScrollView *theScrollView;
@property (nonatomic, retain) NSString *imageLink;
@property (nonatomic, retain) UIImage *theImage;
@property (nonatomic, retain) UILabel *theLabel;
@property (nonatomic, retain) UIProgressView *progressBar;
@property (nonatomic, retain) NSMutableData *resourceData;
@property (nonatomic, retain) NSNumber *filesize;
@end
それが役に立てば幸い
この答えは不要かもしれませんが、@ aditと同様の問題があり、非常に簡単な方法で解決しました(私は思う)。
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor yellowColor];
UIImage *imageToLoad = [UIImage imageNamed:@"background_green"];
self.myImageView = [[UIImageView alloc]initWithImage:imageToLoad];
self.myScrollView = [[UIScrollView alloc]initWithFrame:self.view.bounds];
[self.myScrollView addSubview:self.myImageView];
self.myScrollView.contentSize = self.myImageView.bounds.size;
self.myScrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
self.myScrollView.minimumZoomScale = 0.3f;
self.myScrollView.maximumZoomScale = 3.0f;
self.myScrollView.delegate = self;
[self.view addSubview:self.myScrollView];
}
- (UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView {
NSLog(@"viewForZoomingInScrollView");
return self.myImageView;
}
私の問題は非常に単純で、追加するのを忘れていたself.myScrollView.delegate = self;
、これが問題の原因でした。その単純な問題を理解するのに私は永遠にかかりました、私はすべての木の森を見なかったと思います:-)
UIScrollViewでZooming PDFビューアを開発しているときに、電話で実行すると、実際には既に電話の一部としてズームが実装されていることがわかりました。これ、 http://developer.Apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html これはズーム機能を実装しようとするサンプルコードです。私が始めて欲しいです。
「スクリーンからエッジへのスナップ」ソリューションについては、@ Shrikant Tanwadeがうまく機能しましたが、いくつかのインセットが必要でした。設定制約の定数を試しましたが、うまくいきませんでした。
私は次の解決策で終わった:
shrikantの場合と同じ-scrollView
、imageView
の制約を設定し、それらの定数を0
に設定します。
scrollView.contentInset = UIEdgeInsetsMake(....
でインセットを設定します