Made a custom menu slide. Now the problem with the animation is closing the menu. In theory, he should go from left to right and go back. And not all elements then leave the screen, how to remove them with the view ? Here's a video

Here is the code

 import UIKit public extension UIDevice { var modelName: String { var systemInfo = utsname() uname(&systemInfo) let machineMirror = Mirror(reflecting: systemInfo.machine) let identifier = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8 where value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } switch identifier { case "iPhone4,1": return "iPhone 4s" case "iPhone5,1", "iPhone5,2": return "iPhone 5" case "iPhone5,3", "iPhone5,4": return "iPhone 5c" case "iPhone6,1", "iPhone6,2": return "iPhone 5s" case "iPhone7,2": return "iPhone 6" case "iPhone7,1": return "iPhone 6 Plus" case "iPhone8,1": return "iPhone 6s" case "iPhone8,2": return "iPhone 6s Plus" case "iPhone9,1", "iPhone9,3": return "iPhone 7" case "iPhone9,2", "iPhone9,4": return "iPhone 7 Plus" case "iPhone8,4": return "iPhone SE" case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2" case "iPad3,1", "iPad3,2", "iPad3,3": return "iPad 3" case "iPad3,4", "iPad3,5", "iPad3,6": return "iPad 4" case "iPad4,1", "iPad4,2", "iPad4,3": return "iPad Air" case "iPad5,3", "iPad5,4": return "iPad Air 2" case "iPad2,5", "iPad2,6", "iPad2,7": return "iPad Mini" case "iPad4,4", "iPad4,5", "iPad4,6": return "iPad Mini 2" case "iPad4,7", "iPad4,8", "iPad4,9": return "iPad Mini 3" case "iPad5,1", "iPad5,2": return "iPad Mini 4" case "iPad6,3", "iPad6,4", "iPad6,7", "iPad6,8":return "iPad Pro" case "i386", "x86_64": return "Simulator" default: return identifier } } } let screenSize: CGRect = UIScreen.mainScreen().bounds class LeftMenu: UIViewController { var menuIsActive = false let x: CGFloat = 5 let y: CGFloat = 60 let height: CGFloat = 70 let width: CGFloat = 350 let size1_X: CGFloat = 5 let size1_Y: CGFloat = 70 let height1: CGFloat = 70 let width1: CGFloat = 350 let size2_X: CGFloat = 5 let size2_Y: CGFloat = 70 let height2: CGFloat = 70 let width2: CGFloat = 350 let size3_X: CGFloat = 5 let size3_Y: CGFloat = 70 let height3: CGFloat = 70 let width3: CGFloat = 350 let myView: UIView = { let view = UIView() view.backgroundColor = UIColor.whiteColor() return view }() func toggleMenu() { let backgroundImage = UIImage(named: "bgmenu") let backgroundImageView = UIImageView(image: backgroundImage) let userImageView = UIImageView() userImageView.backgroundColor = UIColor.whiteColor() userImageView.layer.cornerRadius = 30 userImageView.clipsToBounds = true userImageView.layer.borderWidth = 2 userImageView.layer.borderColor = UIColor(red: 255.0 / 255, green: 215.0 / 255, blue: 0 / 255, alpha: 1).CGColor let label = UILabel() label.numberOfLines = 0 label.text = "КІРУ / ТІРКЕЛУ" label.textColor = UIColor.whiteColor() label.font = UIFont(name: "Helvetica", size: 18) label.userInteractionEnabled = true let mainLogo = UIImage(named: "homegray@1x-1") let mainImageView = UIImageView(image: mainLogo) mainImageView.backgroundColor = UIColor.whiteColor() let mainLabel = UILabel() mainLabel.numberOfLines = 0 mainLabel.text = "БАСТЫ" mainLabel.textColor = UIColor.darkGrayColor() mainLabel.font = UIFont(name: "Helvetica", size: 18) let contentLogo = UIImage(named: "menugray@1x-1") let contentImageView = UIImageView(image: contentLogo) contentImageView.backgroundColor = UIColor.whiteColor() let contentLabel = UILabel() contentLabel.numberOfLines = 0 contentLabel.text = "МАЗМҰНЫ" contentLabel.textColor = UIColor.darkGrayColor() contentLabel.font = UIFont(name: "Helvetica", size: 18) let favoriteLogo = UIImage(named: "favgray@1x-1") let favoriteImageView = UIImageView(image: favoriteLogo) favoriteImageView.backgroundColor = UIColor.whiteColor() let favoriteLabel = UILabel() favoriteLabel.numberOfLines = 0 favoriteLabel.text = "ТАҢДАУЛЫЛАР" favoriteLabel.textColor = UIColor.darkGrayColor() favoriteLabel.font = UIFont(name: "Helvetica", size: 18) let offlineLabel = UILabel() offlineLabel.numberOfLines = 0 offlineLabel.text = "ОФФЛАЙН (~2 ГБ)" offlineLabel.textColor = UIColor.darkGrayColor() let switcher = UISwitch() switch UIDevice.currentDevice().modelName { case "iPhone 6 Plus", "iPhone 6s Plus", "iPhone 7 Plus": backgroundImageView.frame = CGRect(x: 0, y: 70, width: 300, height: 100) userImageView.frame = CGRect(x: 30, y: 90, width: 60, height: 60) label.frame = CGRect(x: 97, y: 105, width: 135, height: 30) mainImageView.frame = CGRect(x: 50, y: 190, width: 27, height: 27) mainLabel.frame = CGRect(x: 95, y: 193, width: 135, height: 30) contentImageView.frame = CGRect(x: 50, y: 230, width: 27, height: 27) contentLabel.frame = CGRect(x: 95, y: 233, width: 135, height: 30) favoriteImageView.frame = CGRect(x: 51, y: 270, width: 27, height: 27) favoriteLabel.frame = CGRect(x: 95, y: 273, width: 140, height: 30) offlineLabel.frame = CGRect(x: 15, y: 480, width: 180, height: 30) offlineLabel.font = UIFont(name: "Helvetica", size: 20) switcher.frame = CGRect(x: 230, y: 480, width: 20, height: 20) print("Here 0") //Ставим "Simulator" для того чтобы тесировать на Симуляторе case "iPhone 6", "iPhone 6s", "iPhone 7", "Simulator": backgroundImageView.frame = CGRect(x: 0, y: 0, width: 350, height: 100) userImageView.frame = CGRect(x: 30, y: 25, width: 60, height: 60) label.frame = CGRect(x: 97, y: 35, width: 135, height: 30) mainImageView.frame = CGRect(x: 50, y: 190, width: 27, height: 27) mainLabel.frame = CGRect(x: 95, y: 193, width: 135, height: 30) contentImageView.frame = CGRect(x: 50, y: 230, width: 27, height: 27) contentLabel.frame = CGRect(x: 95, y: 233, width: 135, height: 30) favoriteImageView.frame = CGRect(x: 51, y: 270, width: 27, height: 27) favoriteLabel.frame = CGRect(x: 95, y: 273, width: 140, height: 30) offlineLabel.frame = CGRect(x: 15, y: 480, width: 180, height: 30) offlineLabel.font = UIFont(name: "Helvetica", size: 20) switcher.frame = CGRect(x: 230, y: 480, width: 20, height: 20) print("Here 1") case "iPhone 5", "iPhone 5c", "iPhone SE", "iPhone 5s": backgroundImageView.frame = CGRect(x: 0, y: 0, width: 300, height: 100) userImageView.frame = CGRect(x: 30, y: 20, width: 60, height: 60) label.frame = CGRect(x: 97, y: 32, width: 135, height: 30) mainImageView.frame = CGRect(x: 50, y: 120, width: 27, height: 27) mainLabel.frame = CGRect(x: 95, y: 123, width: 135, height: 30) contentImageView.frame = CGRect(x: 50, y: 160, width: 27, height: 27) contentLabel.frame = CGRect(x: 95, y: 163, width: 135, height: 30) favoriteImageView.frame = CGRect(x: 51, y: 200, width: 27, height: 27) favoriteLabel.frame = CGRect(x: 95, y: 203, width: 140, height: 30) offlineLabel.frame = CGRect(x: 15, y: 410, width: 180, height: 30) offlineLabel.font = UIFont(name: "Helvetica", size: 20) switcher.frame = CGRect(x: 230, y: 410, width: 20, height: 20) print("Here 2") default: break } menuIsActive = !menuIsActive if let window = UIApplication.sharedApplication().keyWindow { if menuIsActive { window.addSubview(myView) //myView.frame = CGRect(x: x, y: y, width: 350, height: window.frame.height - height) myView.addSubview(backgroundImageView) backgroundImageView.addSubview(userImageView) backgroundImageView.addSubview(label) myView.addSubview(mainImageView) myView.addSubview(mainLabel) myView.addSubview(contentImageView) myView.addSubview(contentLabel) myView.addSubview(favoriteImageView) myView.addSubview(favoriteLabel) myView.addSubview(offlineLabel) myView.addSubview(switcher) UIView.animateWithDuration(0.3, delay: 0, options: .TransitionFlipFromLeft, animations: { switch UIDevice.currentDevice().modelName { case "iPhone 6 Plus", "iPhone 6s Plus", "iPhone 7 Plus": self.myView.frame = CGRect(x: self.size3_X, y: self.size3_Y, width: 350, height: window.frame.height - self.height) print("Here 0") case "iPhone 6", "iPhone 6s", "iPhone 7", "Simulator": self.myView.frame = CGRect(x: 5, y: 80, width: 350, height: 550) backgroundImageView.frame = CGRect(x: 0, y: 0, width: 350, height: 100) print("Here 1") case "iPhone 5", "iPhone 5c", "iPhone SE", "iPhone 5s": self.myView.frame = CGRect(x: self.size1_X, y: self.size1_Y, width: 300, height: 450) backgroundImageView.frame = CGRect(x: 0, y: 0, width: 300, height: 100) print("Here 2") default: break } }, completion: nil) } else { UIView.animateWithDuration(0.3, delay: 0, options: .CurveEaseInOut, animations: { print("Left Menu close") self.myView.frame = CGRect(x: 0, y: 0, width: 0, height: 0) backgroundImageView.center.x -= window.bounds.width }, completion: nil) //{ finished in self.myView.removeFromSuperview() } } } } } 

1 answer 1

If you want it to "go" on the left, you only need to change the origin x the view.

Offhand for your case:

 //Начальное положение вьюшки. Положение х за границами видимости на ширину вьюшки. myView.frame = CGRect(x: -350, y: y, width: 350, height: window.frame.height - height) ... UIView.animateWithDuration(0.3, delay: 0, options: .TransitionFlipFromLeft, animations: { //т.е. она только движется по х. С -ширины до 0. и так же заезжает, с 0 до -ширины. Высота и ширина должна быть неизменной. self.myView.frame = CGRect(x: 0, y: y, width: 350, height: window.frame.height - height) //а так как она у Вас только выезжает сбоку, вообще логично менять только x: //self?.vLeft.frame.origin.x = 0 //выезжает //self?.vLeft.frame.origin.x = -350 //заезжает } }, completion: nil) 
  • Fine! Thank you very much! - Zhan