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!
'viewWillLayoutSubviews'is den richtigen Ort die richtige Größe Ihrer Ansichten zu kennen. – Klevison
Es funktioniert perfekt, danke dir :) –