2016-05-26 16 views
0

Ich habe eine einfache View-Controller und ich möchte eine abgerundete Bildansicht in sie einfügen. (Ich verwende das Storyboard überhaupt nicht, ich möchte alles programmgesteuert) Allerdings ist die Bildansicht, was auch immer ich mache, quadratisch.Swift - Rounded UIImageView mit Einschränkungen

class DetailViewController: UIViewController{ 

    // MARK: - Controls 
    var imageView:UIImageView!; 
    var label:UILabel = UILabel(); 
    var button:UIButton = UIButton(); 
    var close:UIButton = UIButton(); 

    // MARK: - Fields 
    var person: Person!; 

    // MARK: - Constructors 
    init(person: Person) { 
     super.init(nibName: nil, bundle: nil); 

     self.person = person; 
     self.view.backgroundColor = UIColor.whiteColor(); 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad(); 

     self.imageView = UIImageView(); 
     self.imageView.image = person.picture; 
     self.imageView.translatesAutoresizingMaskIntoConstraints = false; 
     self.imageView.contentMode = .ScaleAspectFill; 
     self.view.addSubview(self.imageView); 

     self.label.translatesAutoresizingMaskIntoConstraints = false; 
     self.label.text = person.name; 
     self.label.sizeToFit(); 
     self.view.addSubview(self.label); 

     self.button.setTitle("Open Webview", forState: .Normal); 
     self.button.setTitleColor(UIColor.whiteColor(), forState: .Normal); 
     self.button.backgroundColor = UIColor.grayColor(); 
     self.button.translatesAutoresizingMaskIntoConstraints = false; 
     self.button.addTarget(self, action: #selector(DetailViewController.open), forControlEvents: .TouchUpInside); 
     self.view.addSubview(self.button); 

     self.close.setTitle("Close", forState: .Normal); 
     self.close.setTitleColor(UIColor.blueColor(), forState: .Normal); 
     self.close.backgroundColor = UIColor.clearColor(); 
     self.close.translatesAutoresizingMaskIntoConstraints = false; 
     self.close.addTarget(self, action: #selector(DetailViewController.closeView), forControlEvents: .TouchUpInside); 
     self.view.addSubview(self.close); 
     self.close.alpha = 0; 
     if(UIDevice.currentDevice().userInterfaceIdiom == .Pad) { 
      self.close.alpha = 1; 
     } 

     // Center constraint 
     self.view.addConstraint(NSLayoutConstraint(item: button, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0)); 
     self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0)); 
     self.view.addConstraint(NSLayoutConstraint(item: imageView, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0)); 

     // position order constraint 
     self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-20-[close(40)]-60-[imageView(150)]-20-[nameLabel(40)]-35-[button(40)]", options: NSLayoutFormatOptions(rawValue:0), metrics: nil, views: ["close" : close,"imageView" : imageView, "nameLabel" : label, "button" : button])); 

     //width constaints 
     self.view.addConstraint(NSLayoutConstraint(item: button, attribute: .Width, relatedBy: .Equal, toItem: self.view, attribute: .Width, multiplier: 0.5, constant: 0)); 
     self.view.addConstraint(NSLayoutConstraint(item: imageView, attribute: .Width, relatedBy: .Equal, toItem: imageView, attribute: .Height, multiplier: 1, constant: 0)); 
     self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[close(60)]-20-|", options: NSLayoutFormatOptions(rawValue:0), metrics: nil, views: ["close" : close])); 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(false); 
     let dSize: CGFloat = min(imageView.frame.height, imageView.frame.width) 
     imageView.bounds = CGRectMake(0, 0, dSize, dSize) // centered in container you want to use bounds over frame for this scenario 
     imageView.layer.cornerRadius = dSize/2.0 
     imageView.layer.masksToBounds = true; 
     imageView.layer.borderWidth = 3.0 
     imageView.layer.borderColor = UIColor.redColor().CGColor 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func open() { 

     if(UIDevice.currentDevice().userInterfaceIdiom == .Pad) { 
      self.presentViewController(WebViewController(url: self.person.url), animated: false, completion: nil); 
     } else { 
      self.presentViewController(WebViewController(url: self.person.url), animated: true, completion: nil); 
     } 
    } 

    func closeView() { 
     self.dismissViewControllerAnimated(true, completion: nil); 
    } 

} 

Es funktioniert sehr gut, wenn ich Rahmen anstelle von Einschränkungen, aber ich will es mit Einschränkungen tun, wie ich dies zu lernen.

Kann mir bitte jemand eine Wegbeschreibung geben?

Vielen Dank im Voraus!

Antwort

2

Put

let dSize: CGFloat = min(imageView.frame.height, imageView.frame.width) 
    imageView.bounds = CGRectMake(0, 0, dSize, dSize) // centered in container you want to use bounds over frame for this scenario 
    imageView.layer.cornerRadius = dSize/2.0` 

in viewWillLayoutSubviews

+0

'viewWillLayoutSubviews'is den richtigen Ort die richtige Größe Ihrer Ansichten zu kennen. – Klevison

+0

Es funktioniert perfekt, danke dir :) –

Verwandte Themen