Используя Swift 4 и Xcode 9, это рабочий пример округления ImageView
с теневой тканью и границей.
//set dimensions and position of image (in this case, centered)
let imageHeight: CGFloat = 150, imageWidth: CGFloat = 150
let xPosition = (self.view.frame.width / 2) - (imageWidth / 2)
let yPosition = (self.view.frame.height / 2) - (imageHeight / 2)
//set desired corner radius
let cornerRadius: CGFloat = 20
//create container for the image
let imageContainer = UIView(frame: CGRect(x: xPosition, y: yPosition, width: imageWidth, height: imageHeight))
//configure the container
imageContainer.clipsToBounds = false
imageContainer.layer.shadowColor = UIColor.black.cgColor
imageContainer.layer.shadowOpacity = 1
imageContainer.layer.shadowOffset = CGSize(width: 3.0, height: 3.0)
imageContainer.layer.shadowRadius = 5
imageContainer.layer.shadowPath = UIBezierPath(roundedRect: imageContainer.bounds, cornerRadius: cornerRadius).cgPath
//create imageView
let imageView = UIImageView(frame: imageContainer.bounds)
//configure the imageView
imageView.clipsToBounds = true
imageView.layer.cornerRadius = cornerRadius
//add a border (if required)
imageView.layer.borderColor = UIColor.black.cgColor
imageView.layer.borderWidth = 1.0
//set the image
imageView.image = UIImage(named: "bird")
//add the views to the superview
view.addSubview(imageContainer)
imageContainer.addSubview(imageView)
Если вы хотите, чтобы изображение было кругом: (и показано без рамки)
let cornerRadius = imageWidth / 2
Открытие и закрытие соединений с базой данных являются дорогостоящими операциями с точки зрения времени и ресурсов. В то же время, если соединение остается открытым в течение длительного времени, это может привести к утечке памяти или угрозе безопасности.
Таким образом, рекомендуемый подход состоит в том, чтобы открывать соединение с базой данных только при необходимости и закрывать, как только цель его открытия обслуживается.
В приведенном вами примере несколько операций с базами данных выполняются за один раз. Таким образом, вместо открытия соединения индивидуально для каждой операции, открывается только одно соединение, и оно закрывается после выполнения операции. Здесь соединение открывается и закрывается вручную.
Новые подходы DataAccess Layers, такие как EntityFramework и т. Д., Выполняют эту работу внутренне.
UsersPhonesDBContext.Database.SqlQuery<Phones>("dbo.InsertPhones @model", sqlParam);
В этой строке кода соединение с базой данных открывается и закрывается внутри, не беспокоясь об этом.
Таким образом, основной мотив состоит в том, чтобы свести к минимуму операции по открытию и закрытию соединения и закрыть соединение, как только цель его открытия закончится.