我有以下方法(例如),我希望能够在iOS + Swift项目中的任何ViewController中使用它:
func initializeBlurEffectOnGivenUIView(UIViewToBeBlurred: UIView) {
let UIViewToBeBlurredHeight = UIViewToBeBlurred.frame.size.height
let UIViewToBeBlurredWidth = UIViewToBeBlurred.frame.size.width
let UIViewToBeBlurredX = UIViewToBeBlurred.frame.origin.x
let UIViewToBeBlurredY = UIViewToBeBlurred.frame.origin.y
let blurEffect:UIBlurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light)
let vibrancyEffect = UIVibrancyEffect(forBlurEffect: blurEffect)
let vibrancyEffectView = UIVisualEffectView(effect: vibrancyEffect)
let blurEffectView:UIVisualEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = CGRectMake(UIViewToBeBlurredX, UIViewToBeBlurredY, UIViewToBeBlurredWidth, UIViewToBeBlurredHeight)
blurEffectView.contentView.addSubview(vibrancyEffectView)
UIViewToBeBlurred.addSubview(blurEffectView)
}
我有更常见的助手,比如那里我也想提供。如何构建应用程序以实现此目的?
答案 0 :(得分:18)
如果该函数是自由全局函数,请将该函数放在任何文件的顶层。 (只是不要不小心重复自己,并在所有文件的顶层放置相同的功能。)例如,这就是我对我在这里描述的delay
效用函数的处理方式:dispatch_after - GCD in swift? < / p>
但是,在您给出的示例的特定情况下,我可能会将其放在UIView的扩展中。我将其重写为实例方法,因此我们不是模糊另一个视图,而是从现有视图开始并模糊self
。
答案 1 :(得分:7)
使用扩展程序,如下所示:
extension UIView {
func initializeBlurEffect() {
let height = self.frame.size.height
let width = self.frame.size.width
let x = self.frame.origin.x
let y = self.frame.origin.y
let blurEffect:UIBlurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light)
let vibrancyEffect = UIVibrancyEffect(forBlurEffect: blurEffect)
let vibrancyEffectView = UIVisualEffectView(effect: vibrancyEffect)
let blurEffectView:UIVisualEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = CGRectMake(x, y, width, height)
blurEffectView.contentView.addSubview(vibrancyEffectView)
self.addSubview(blurEffectView)
}
}
然后这样称呼:
myview.initializeBlurEffect()
答案 2 :(得分:2)
如果你想全局访问这个功能,你可以把它放在任何文件之上,或者系统地创建一个普通的swift文件并将其添加到那里。
OR 如果你想在UIViews或viewcontroller中访问它,你可以创建uiview的扩展(由@Mike建议)
答案 3 :(得分:0)
您可以为此创建公共类,如下所示:
class Utils {
//MARK:- STRING FROM DICT
func getStringFromDictionary(dict:Any) -> String{
var strJson = ""
do {
let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions.prettyPrinted)
strJson = String(data: data, encoding: String.Encoding.utf8)!
} catch let error as NSError {
print("json error: \(error.localizedDescription)")
}
return strJson
}
//MARK:- ALERT
func showAlertWithTitleFromVC(vc:UIViewController, title:String, andMessage message:String, buttons:[String], completion:((_ index:Int) -> Void)!) -> Void {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
for index in 0..<buttons.count {
// alertController.setValue(NSAttributedString(string: title, attributes: [NSFontAttributeName : UIFont.appFont_OpenSans_Regular(fontSize: 15),NSForegroundColorAttributeName : BLACK_COLOR]), forKey: "attributedTitle")
//
// alertController.setValue(NSAttributedString(string: message, attributes: [NSFontAttributeName : UIFont.appFont_OpenSans_Regular(fontSize: 13),NSForegroundColorAttributeName : APP_COLOR_BLUE_1]), forKey: "attributedMessage")
let action = UIAlertAction(title: buttons[index], style: .default, handler: {
(alert: UIAlertAction!) in
if(completion != nil){
completion(index)
}
})
// action.setValue(APP_COLOR_BLUE_2, forKey: "titleTextColor")
alertController.addAction(action)
}
vc.present(alertController, animated: true, completion: nil)
}
//MARK:- ACTION SHEET
func showActionSheetWithTitleFromVC(vc:UIViewController, title:String, andMessage message:String, buttons:[String],canCancel:Bool, completion:((_ index:Int) -> Void)!) -> Void {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .actionSheet)
alertController.setValue(NSAttributedString(string: title, attributes: [NSFontAttributeName : UIFont.appFont_OpenSans_Regular(fontSize: 15),NSForegroundColorAttributeName : BLACK_COLOR]), forKey: "attributedTitle")
alertController.setValue(NSAttributedString(string: message, attributes: [NSFontAttributeName : UIFont.appFont_OpenSans_Regular(fontSize: 13),NSForegroundColorAttributeName : APP_COLOR_BLUE_1]), forKey: "attributedMessage")
for index in 0..<buttons.count {
let action = UIAlertAction(title: buttons[index], style: .default, handler: {
(alert: UIAlertAction!) in
if(completion != nil){
completion(index)
}
})
action.setValue(APP_COLOR_BLUE_2, forKey: "titleTextColor")
alertController.addAction(action)
}
if(canCancel){
let action = UIAlertAction(title: "Cancel", style: .cancel, handler: {
(alert: UIAlertAction!) in
if(completion != nil){
completion(buttons.count)
}
})
action.setValue(APP_COLOR_BLUE_2, forKey: "titleTextColor")
alertController.addAction(action)
}
vc.present(alertController, animated: true, completion: nil)
}
//MARK:- INTERNET CHECK
func IS_INTERNET_AVAILABLE() -> Bool{
return AIReachabilityManager.shared.isInternetAvailableForAllNetworks()
}
let INTERNET_MESSAGE:String = "Oops! It seems that you're not connected to the Internet, connect and try again"//"No internet connection, Please try later"
func SHOW_INTERNET_ALERT(){
showAlertWithTitleFromVC(vc: (appDelegate.window?.rootViewController)!, title: APP_NAME, andMessage: INTERNET_MESSAGE, buttons: ["Dismiss"]) { (index) in
}
}
//MARK:- CUSTOM LOADER
func SHOW_CUSTOM_LOADER(){
SHOW_CUSTOM_LOADER_WITH_TEXT(text: "")
}
func SHOW_CUSTOM_LOADER_WITH_TEXT(text:String){
SVProgressHUD.setDefaultStyle(.custom)
SVProgressHUD.setDefaultMaskType(.custom)
SVProgressHUD.setDefaultAnimationType(.flat)
SVProgressHUD.setBackgroundColor(UIColor.clear)
SVProgressHUD.setRingRadius(30)
SVProgressHUD.setRingThickness(5)
SVProgressHUD.setForegroundColor(WHITE_COLOR)
if(text.characters.count > 0){
SVProgressHUD.show(withStatus: text)
}else{
SVProgressHUD.show()
}
}
func HIDE_CUSTOM_LOADER(){
SVProgressHUD.dismiss()
}
//MARK:- USER DEFAULTS
func setUserDefaultsFor(object:AnyObject, with key:String) {
UserDefaults.standard.set(object, forKey: key)
UserDefaults.standard.synchronize()
}
func getUserDefaultsForKey(key:String) -> AnyObject? {
return UserDefaults.standard.object(forKey: key) as AnyObject?
}
func removeUserDefaultsFor(key:String) {
UserDefaults.standard.removeObject(forKey: key)
UserDefaults.standard.synchronize()
}
//MARK:- PROPORTIONAL SIZE
let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
let SCREEN_WIDTH = UIScreen.main.bounds.size.width
func GET_PROPORTIONAL_WIDTH (width:CGFloat) -> CGFloat {
return ((SCREEN_WIDTH * width)/750)
}
func GET_PROPORTIONAL_HEIGHT (height:CGFloat) -> CGFloat {
return ((SCREEN_HEIGHT * height)/1334)
}
//MARK:- NETWORK ACTIVITY INDICATOR
func SHOW_NETWORK_ACTIVITY_INDICATOR(){
UIApplication.shared.isNetworkActivityIndicatorVisible = true
}
func HIDE_NETWORK_ACTIVITY_INDICATOR(){
UIApplication.shared.isNetworkActivityIndicatorVisible = false
}
//Check IsiPhone Device
func IS_IPHONE_DEVICE()->Bool{
let deviceType = UIDevice.current.userInterfaceIdiom == .phone
return deviceType
}
//Check IsiPad Device
func IS_IPAD_DEVICE()->Bool{
let deviceType = UIDevice.current.userInterfaceIdiom == .pad
return deviceType
}
//iPhone 4 OR 4S
func IS_IPHONE_4_OR_4S()->Bool{
let SCREEN_HEIGHT_TO_CHECK_AGAINST:CGFloat = 480
var device:Bool = false
if(SCREEN_HEIGHT_TO_CHECK_AGAINST == SCREEN_HEIGHT) {
device = true
}
return device
}
func proportionalFontSize() -> CGFloat {
var sizeToCheckAgainst = self
if(IS_IPAD_DEVICE()) {
sizeToCheckAgainst += 12
}
else {
if(IS_IPHONE_6P_OR_6SP()) {
sizeToCheckAgainst += 1
}
else if(IS_IPHONE_6_OR_6S()) {
sizeToCheckAgainst += 0
}
else if(IS_IPHONE_5_OR_5S()) {
sizeToCheckAgainst -= 1
}
else if(IS_IPHONE_4_OR_4S()) {
sizeToCheckAgainst -= 2
}
}
return sizeToCheckAgainst
}
//iPhone 5 OR OR 5C OR 4S
func IS_IPHONE_5_OR_5S()->Bool{
let SCREEN_HEIGHT_TO_CHECK_AGAINST:CGFloat = 568
var device:Bool = false
if(SCREEN_HEIGHT_TO_CHECK_AGAINST == SCREEN_HEIGHT) {
device = true
}
return device
}
//iPhone 6 OR 6S
func IS_IPHONE_6_OR_6S()->Bool{
let SCREEN_HEIGHT_TO_CHECK_AGAINST:CGFloat = 667
var device:Bool = false
if(SCREEN_HEIGHT_TO_CHECK_AGAINST == SCREEN_HEIGHT) {
device = true
}
return device
}
//iPhone 6Plus OR 6SPlus
func IS_IPHONE_6P_OR_6SP()->Bool{
let SCREEN_HEIGHT_TO_CHECK_AGAINST:CGFloat = 736
var device:Bool = false
if(SCREEN_HEIGHT_TO_CHECK_AGAINST == SCREEN_HEIGHT) {
device = true
}
return device
}
//MARK:- DEVICE ORIENTATION CHECK
func IS_DEVICE_PORTRAIT() -> Bool {
return UIDevice.current.orientation.isPortrait
}
func IS_DEVICE_LANDSCAPE() -> Bool {
return UIDevice.current.orientation.isLandscape
}
//MARK:- SYSTEM VERSION CHECK
func SYSTEM_VERSION_EQUAL_TO(version: String) -> Bool {
return UIDevice.current.systemVersion.compare(version,
options: NSString.CompareOptions.numeric) == ComparisonResult.orderedSame
}
func SYSTEM_VERSION_GREATER_THAN(version: String) -> Bool {
return UIDevice.current.systemVersion.compare(version,
options: NSString.CompareOptions.numeric) == ComparisonResult.orderedDescending
}
func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool {
return UIDevice.current.systemVersion.compare(version,
options: NSString.CompareOptions.numeric) != ComparisonResult.orderedAscending
}
func SYSTEM_VERSION_LESS_THAN(version: String) -> Bool {
return UIDevice.current.systemVersion.compare(version,
options: NSString.CompareOptions.numeric) == ComparisonResult.orderedAscending
}
func SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(version: String) -> Bool {
return UIDevice.current.systemVersion.compare(version,
options: NSString.CompareOptions.numeric) != ComparisonResult.orderedDescending
}
}