2016-07-21 15 views
9

Ich habe UIWebView und in seiner Scrollview, Ich habe eine UIImageView wie so:Swift - UIImageView Halten Sie in der gleichen Position auf drehen

self.webview.scrollView.addSubview(image) 

mein Problem ist, wenn ich mein Gerät von Hoch- auf Querformat drehen die UIImageView tut nicht an der Position bleiben, die ich ursprünglich auf der ScrollView gesetzt habe, ich verstehe die Breite und Höhe des Bildschirms ändern, ich denke, was ich versuche, es zu ändern, die Position auf meinem UIImageView, so scheint es nicht geändert hat.

Ich habe diese Methode anstelle:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 

     var newScrollViewFrame = webview.scrollView.frame 
     var newFrame = webview.frame 

     newFrame.size.width = size.width 
     newFrame.size.height = size.height 

     newScrollViewFrame.size.width = size.width 
     newScrollViewFrame.size.height = size.height 

     webview.frame = newFrame 
     webview.scrollView.frame = newScrollViewFrame 

    } 

Der aktuelle Code in dieser Methode nur die UIWebView und seine Scroll-Ansicht Größe ändern, aber nicht die UIImageViews im Scroll

Jede Hilfe würde geschätzt.

Danke,

ich folgendes versucht:

for views in webview.scrollView.subviews 
     { 
      if(views.isKindOfClass(UIImageView)) 
      { 
       views.transform = CGAffineTransformMakeRotation(CGFloat(M_PI)/2); 

      } 
     } 
auf drehen

aber dies setzt auf UIImageView seitwärts

Hier ist, wie ich die Webansicht zu der Ansicht bin und fügte hinzu:

webview = UIWebView() 

     webview.frame = self.view.bounds 
     webview.scrollView.frame = webview.frame 

     webview.userInteractionEnabled = true 
     webview.scalesPageToFit = true 
     webview.becomeFirstResponder() 
     webview.delegate = self 
     webview.scrollView.delegate = self 
     self.view.addSubview(webview) 

Ich habe mein Problem halb gelöst, aber folgendes tun:

Aber jetzt ist das UIWebView nicht volle Breite oder Höhe:

Ich habe das auch versucht, aber die UIImageView bleiben nicht an der gleichen Stelle.

let left = NSLayoutConstraint(item: self.webView, attribute: .Left, relatedBy: .Equal, toItem: self.view, attribute: .Left, multiplier: 1, constant: 0) 

let right = NSLayoutConstraint(item: self.webView, attribute: .Right, relatedBy: .Equal, toItem: self.view, attribute: .Right, multiplier: 1, constant: 0) 

let top = NSLayoutConstraint(item: self.webView, attribute: .Top, relatedBy: .Equal, toItem: self.view, attribute: .Top, multiplier: 1, constant: 0) 

let bottom = NSLayoutConstraint(item: self.webView, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1, constant: 0) 

NSLayoutConstraint.activateConstraints([top, bottom, left, right]) 

Ich habe auch versucht, Einschränkungen der UIImageView Zugabe

let stampView:StampAnnotation = StampAnnotation(imageIcon: UIImage(named: "approved.png"), location: CGPointMake(currentPoint.x, currentPoint.y)) 
      self.webview.scrollView.addSubview(stampView) 

      let left = NSLayoutConstraint(item: stampView, attribute: .Left, relatedBy: .Equal, toItem: self.webview.scrollView, attribute: .Left, multiplier: 1, constant: 0) 

      let right = NSLayoutConstraint(item: stampView, attribute: .Right, relatedBy: .Equal, toItem: self.webview.scrollView, attribute: .Right, multiplier: 1, constant: 0) 

      let top = NSLayoutConstraint(item: stampView, attribute: .Top, relatedBy: .Equal, toItem: self.webview.scrollView, attribute: .Top, multiplier: 1, constant: 0) 

      let bottom = NSLayoutConstraint(item: stampView, attribute: .Bottom, relatedBy: .Equal, toItem: self.webview.scrollView, attribute: .Bottom, multiplier: 1, constant: 0) 

      NSLayoutConstraint.activateConstraints([top, bottom, left, right]) 

gleiche Ergebnis tritt UIImageView nicht an der gleichen Stelle bleiben.

UPDATE

Mein Webansicht:

webview = UIWebView() 
     webview.userInteractionEnabled = true 
     webview.scalesPageToFit = true 
     webview.becomeFirstResponder() 
     webview.delegate = self 
     webview.scrollView.delegate = self 
     self.view.addSubview(webview) 

     webview.loadRequest(NSURLRequest(URL:url)) 
     webview.gestureRecognizers = [pinchRecognizer, panRecognizer] 
     webview.translatesAutoresizingMaskIntoConstraints = false 

     let left = NSLayoutConstraint(item: webview, attribute: .Left, relatedBy: .Equal, toItem: self.view, attribute: .Left, multiplier: 1, constant: 0) 

     let right = NSLayoutConstraint(item: webview, attribute: .Right, relatedBy: .Equal, toItem: self.view, attribute: .Right, multiplier: 1, constant: 0) 

     let top = NSLayoutConstraint(item: webview, attribute: .Top, relatedBy: .Equal, toItem: self.view, attribute: .Top, multiplier: 1, constant: 0) 

     let bottom = NSLayoutConstraint(item: webview, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1, constant: 0) 

     NSLayoutConstraint.activateConstraints([top, bottom, left, right]) 

UIImageView

stampView.translatesAutoresizingMaskIntoConstraints = false 

      let left = NSLayoutConstraint(item: stampView, attribute: .Left, relatedBy: .Equal, toItem: self.webview.scrollView, attribute: .Left, multiplier: 1, constant: 100) 

      let right = NSLayoutConstraint(item: stampView, attribute: .Right, relatedBy: .Equal, toItem: self.webview.scrollView, attribute: .Right, multiplier: 1, constant: 0) 

      let top = NSLayoutConstraint(item: stampView, attribute: .Top, relatedBy: .Equal, toItem: self.webview.scrollView, attribute: .Top, multiplier: 1, constant: 100) 

      let bottom = NSLayoutConstraint(item: stampView, attribute: .Bottom, relatedBy: .Equal, toItem: self.webview.scrollView, attribute: .Bottom, multiplier: 1, constant: 0) 

      let width = NSLayoutConstraint(item: stampView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0.1, constant: 150) 

      let height = NSLayoutConstraint(item: stampView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 73) 

      NSLayoutConstraint.activateConstraints([left, right, top, bottom, width, height]) 

Ich muss nur die Mathematik herauszufinden, dieses Gerät an der Position der Berührung zu haben. (In Prozent?)

+0

Gibt es einen Grund/eine Einschränkung, das automatische Layout nicht zu verwenden? – RomOne

+0

Nein, was soll ich tun RomOne? – user979331

+0

Zum Beispiel könnten Sie Ihrem Bild 4 Einschränkungen hinzufügen. .centerX in Bezug auf die Webansicht, den oberen Abstand, den unteren Abstand zu anderen Ansichten in der Webansicht und dann eine proportionale Breite zur Webansicht. Denken Sie daran, dass Ihre Scrollview entsprechend ihrem Inhalt eingestellt ist, so dass Sie Constraints in einer bestimmten Weise festlegen müssen. Sie können dieses Tutorial überprüfen, um eine Idee zu haben, wie man macht http://mokagio.github.io/tech-journal/2015/06/24/ios-scroll-view-and-interface-builder.html – RomOne

Antwort

1

Ich denke, diese Dinge sind immer einfacher ohne Auto-Layout zu tun. Um dies zu tun, empfehle ich mit ViewDidLayoutSubviews(). Hier ist mein Code:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    webView.frame = view.bounds 

    let screen = UIScreen.mainScreen().fixedCoordinateSpace 

    //These values will give a rect half the size of the screen and centered. 
    let width = screen.bounds.width/2 
    let height = screen.bounds.height/2 
    let x = (screen.bounds.width - width)/2 
    let y = (screen.bounds.height - height)/2 
    let absoluteRect = CGRect(x: x, y: y, width: width, height: height) 

    let stampRect = screen.convertRect(absoluteRect, toCoordinateSpace: webView) 
    stampView.frame = stampRect 

    //Change the orientation of the image 
    switch UIDevice.currentDevice().orientation { 
    case .LandscapeLeft: 
     stampView.image = UIImage(CGImage:originalImage.CGImage!, scale:originalImage.scale, orientation: UIImageOrientation.Left) 
     break 
    case .LandscapeRight: 
     stampView.image = UIImage(CGImage:originalImage.CGImage!, scale:originalImage.scale, orientation: UIImageOrientation.Right) 
     break 
    default: 
     stampView.image = UIImage(CGImage:originalImage.CGImage!, scale:originalImage.scale, orientation: UIImageOrientation.Up) 
     break 
    } 
} 

Ich mache mehrere Dinge hier ... Zuerst habe ich den WebViewFrame eingestellt. Als nächstes ist es hilfreich, hier ein absolutes Koordinatensystem relativ zu Ihrem Bildschirm zu definieren. Wenn sich die Ausrichtung des Telefons ändert, ändern sich die Werte des Bildschirms nicht (so können Sie Ihre imageView an der gleichen Stelle halten.) Als nächstes definiere ich den gewünschten Rahmen für die stampView und wandle dann den absoluten Rahmen in die entsprechende scrollView um (es ist superView) und ordnen Sie es der stampView zu. Wenn Sie möchten, dass das Bild in Ihrer stampView immer korrekt ausgerichtet ist, müssen Sie die Bildausrichtung ändern. CGAffineTransformMakeRotation funktioniert nur, wenn Ihre Ansicht quadratisch ist, aber wir können sie allgemeiner gestalten, indem Sie die imageOrientation innerhalb der stampView ändern. Dies erfordert eine Eigenschaft für das Originalbild:

let originalImage = UIImage(named: "image_name")! 

Schließlich weil viewWillLayoutSubViews() ist nicht für die Landschaft zu Landschaft Übergänge genannt, gehen Sie wie folgt vor:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    view.setNeedsLayout() 
} 

Dieser Code macht nicht Für die schönsten Übergänge sollte es bei Ihren Layout-Problemen helfen.

+0

Das sollte also meine beiden Probleme lösen? Ich bin aufgeregt, es zu versuchen :) – user979331

+0

@ user979331 Überprüfen Sie meine Antwort auf Ihre andere Frage (http://stackoverflow.com/questions/38537326/swift-add-uiimageview-as-subview-of-uiwebview-scrollview-and- Skalierung/38662092 # 38662092). Ich denke, das ist mehr, was Sie suchen. Ich glaube, ich habe deine Frage falsch verstanden. – CarlNathan

+0

Ich super aufgeregt, es zu versuchen, wenn ich von der Arbeit nach Hause komme. – user979331

0

Um die UIImageView zu machen halten die gleiche Größe und zum UIWebView in der gleichen Position relativ bleiben, können Sie Ihre Ansichten setzen einen Prozentsatz ihrer jeweiligen superView zu sein.Hier habe ich einige Mock Ansichten erstellt, die die Grundidee veranschaulichen:

import UIKit 

class ViewController: UIViewController { 

//we create some views for testing and create references to the size and points we need for positioning 
let webView = UIWebView() 
let image = UIImageView() 
let image2 = UIImageView() 
var imageViewSize = CGSize() 
var imageViewCenter = CGPoint() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //set webView frame 
    webView.frame = self.view.bounds 
    webView.backgroundColor = UIColor.clearColor() 
    webView.userInteractionEnabled = true 
    webView.scalesPageToFit = true 
    webView.opaque = false 
    self.view.addSubview(webView) 

    //we will hold onto the original size of the UIImageView for later 
    imageViewSize = CGSizeMake(webView.bounds.size.width * 0.2, webView.bounds.size.height * 0.1) 

    //mock UIImageView 
    image.backgroundColor = UIColor.orangeColor() 
    image.frame.size = CGSizeMake(imageViewSize.width, imageViewSize.height) 
    image.center = CGPointMake(webView.bounds.size.width/2, webView.bounds.size.height/2) 
    webView.scrollView.addSubview(image) 

    //I've created a subset image to illustrate the orientation 
    image2.backgroundColor = UIColor.whiteColor() 
    image2.frame = CGRectMake(10, 10, 10, 10) 
    image.addSubview(image2) 
} 

Und dann den Rahmen ändern, wenn sie gedreht (Beachten Sie, dass die Position auf der UIImageView und die Breite des UIWebView relativ eingestellt sind auf die Höhe ihre superView s und umgekehrt, da das Gerät gedreht wird):

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    image.frame.size = CGSizeMake(imageViewSize.width, imageViewSize.height) 
    image.center = CGPointMake(webView.bounds.size.height/2, webView.bounds.size.width/2) 
    webView.frame = CGRectMake(0, 0, self.view.bounds.size.height, self.view.bounds.size.width) 
    webView.scrollView.contentSize = webView.frame.size 
} 
} 

da Sie die Position und die Größe Ihrer Ansichten in Prozent ihrer superView s schaffen, wird der Code spielt schöner mit verschiedenen Vorrichtungsgrößen (d. H. iPhone/iPad).

+0

das funktioniert nicht, das macht meine webview viel kleiner (bevor es der Vollbild war) und wenn ich mein Telefon rotiere, bleibt das UIImageView nicht in einer relativen Position. – user979331

+0

Ich habe die Ansicht zur Veranschaulichung kleiner als den Bildschirm. Bitte geben Sie den Code ein, den Sie zum Erstellen Ihrer Webansicht verwenden, und fügen Sie ihn der Superansicht hinzu. – jsondwyer

+0

'webview = UIWebView() webview.frame = self.view.bounds webview.scrollView.frame = webview.Rahmen webview.userInteractionEnabled = true webview.scalesPageToFit = true webview.becomeFirstResponder() webview.delegate = Selbst webview.scrollView.delegate = Selbst self.view.addSubview (Webview) ' – user979331

Verwandte Themen