2016-04-25 8 views
3

スクロールビューのcontentOffsetを変更し、現在の変換マトリックスを変換することにより、スクロールビューの内容をスナップショットするa classがあります。これは、PDFコンテキストで新しいページを作成するためです。結果は、PDFページサイズのチャンクでスクロールビューのすべての内容を含むPDFです。Core Graphicsの変換マトリックスはiPadとは異なる働きをしますか?

iPadでは、これは両方向と両方向で機能しますが、デバイスが横向きの場合、iPhoneではスナップショットが失敗します(空のPDFが生成されます)。 iPhoneでiOSが回転を処理する方法と関係があるのか​​どうか疑問に思っていました。

私は行方不明または間違っていることがありますか? iPadはiPhoneが行う現在の変換行列で同じ変換を行わない場合、私は思ったんだけど

class ScrollViewSnapshotter: NSObject { 

    func PDFWithScrollView(scrollview: UIScrollView) -> NSData { 

     let pageDimensions = scrollview.bounds 

     let pageSize = pageDimensions.size 
     let totalSize = scrollview.contentSize 

     let numberOfPagesThatFitHorizontally = Int(ceil(totalSize.width/pageSize.width)) 
     let numberOfPagesThatFitVertically = Int(ceil(totalSize.height/pageSize.height)) 

     let outputData = NSMutableData() 

     UIGraphicsBeginPDFContextToData(outputData, pageDimensions, nil) 

     let savedContentOffset = scrollview.contentOffset 
     let savedContentInset = scrollview.contentInset 

     scrollview.contentInset = UIEdgeInsetsZero 

     if let context = UIGraphicsGetCurrentContext() 
     { 
      for indexHorizontal in 0 ..< numberOfPagesThatFitHorizontally 
      { 
       for indexVertical in 0 ..< numberOfPagesThatFitVertically 
       { 

        UIGraphicsBeginPDFPage() 

        let offsetHorizontal = CGFloat(indexHorizontal) * pageSize.width 
        let offsetVertical = CGFloat(indexVertical) * pageSize.height 

        scrollview.contentOffset = CGPointMake(offsetHorizontal, offsetVertical) 
        CGContextTranslateCTM(context, -offsetHorizontal, -offsetVertical) // NOTE: Negative offsets 

        scrollview.layer.renderInContext(context) 
       } 
      } 
     } 

     UIGraphicsEndPDFContext() 

     scrollview.contentInset = savedContentInset 
     scrollview.contentOffset = savedContentOffset 

     return outputData 
    } 
} 

は、ここに私のコードです。これは本当ですか?

+0

は何ですかあなたがテストしているデバイスのOSバージョン? –

+0

これはiPad Air 2とiOS 9.xと10.x – Moshe

+0

で "snapshot fails"と定義されている可能性があります。 – paiv

答えて

0

PDFを取り込む前に手動でスクロールすると、iPadで正しく出力されません。

あなたはscrollView.bounds.offsetを考慮してあります。

CGContextTranslateCTM(
    context, 
    -offsetHorizontal + pageDimensions.minX, 
    -offsetVertical - pageDimensions.minY) 
1

あなたはCGAffineTransformを使用する必要があります。アフィン変換関数は、CGAffineTransformデータ構造上で動作し、それを返す。 Quartzのアフィン変換関数は、CTMsではなく行列上で動作します。これらの要素を使用して行列自体を構築し、連結関数CGContextConcatCTMを呼び出してCTMに適用する必要があります。

Interface Orientationの記事をご覧ください。変換行列にはいくつかのヒントがあります。

それとも、拡張子を使用することができます:私はこれがあなたのためにそれをやるべきだと思う

extension CGAffineTransform { 

    public func translatedBy(x tx: CGFloat, y ty: CGFloat) -> CGAffineTransform 
    public func rotate(by angle: CGFloat) -> CGAffineTransform 
    public func scaledBy(x sx: CGFloat, y sy: CGFloat) -> CGAffineTransform 
} 

enter image description here

0

を...ちょうどあなたのループ内で1行を追加します。

if let context = UIGraphicsGetCurrentContext() 
    { 
     for indexHorizontal in 0 ..< numberOfPagesThatFitHorizontally 
     { 
      for indexVertical in 0 ..< numberOfPagesThatFitVertically 
      { 

       UIGraphicsBeginPDFPage() 

       let offsetHorizontal = CGFloat(indexHorizontal) * pageSize.width 
       let offsetVertical = CGFloat(indexVertical) * pageSize.height 

       scrollview.contentOffset = CGPointMake(offsetHorizontal, offsetVertical) 
       CGContextTranslateCTM(context, -offsetHorizontal, -offsetVertical) // NOTE: Negative offsets 

       // Translate again, with the original Content Offsets 
       // Positive X, Negative Y 
       CGContextTranslateCTM(context, savedContentOffset.x, -savedContentOffset.y) 

       scrollview.layer.renderInContext(context) 
      } 
     } 
    } 
関連する問題