给大家推荐两个学习的地址:

极客学院的视频:http://www.jikexueyuan.com/path/ios/

一个博客:http://blog.csdn.net/lizhongfu2013/article/details/29210015

主要想要实现一个模仿的登陆界面

代码:

  1. //
  2. // LoginViewController.swift
  3. // IBM_LOGIN
  4. //
  5. // Created by dcintern on 6/26/15.
  6. // Copyright (c) 2015 dcintern. All rights reserved.
  7. //
  8.  
  9. //import Foundation
  10.  
  11. import UIKit
  12.  
  13. class LoginViewController: UIViewController
  14. {
  15.  
  16. /// 定义属性
  17. var QQNumber = UITextField()
  18. var PassNumber = UITextField()
  19.  
  20. override func viewDidLoad() {
  21.  
  22. self.view.backgroundColor = UIColor.whiteColor()
  23. super.viewDidLoad()
  24.  
  25. // 添加头图片
  26. [self .addAllSubViews()];
  27. }
  28.  
  29. // 添加所有子控件
  30. func addAllSubViews(){
  31.  
  32. /// 平铺背景
  33. var headImage = UIImageView(frame: CGRectMake(0,0, 400, 800))
  34. headImage.image = UIImage(named:"123.jpeg")
  35. self.view.addSubview(headImage)
  36.  
  37. /// QQ号输入提示,暂时没有用到
  38. var phoneText = UILabel(frame: CGRectMake(30, 240, UIScreen.mainScreen().bounds.size.width-60, 30))
  39. phoneText.text = ""
  40. self.view.addSubview(phoneText)
  41.  
  42. /// QQ号输入框
  43. var QQNumber = UITextField(frame: CGRectMake(30, 150, UIScreen.mainScreen().bounds.size.width-60, 30))
  44. QQNumber.placeholder = " username"
  45. QQNumber.layer.borderWidth = 2
  46. QQNumber.layer.borderColor = UIColor.lightGrayColor().CGColor
  47. QQNumber.layer.cornerRadius = 5
  48. QQNumber.keyboardType = UIKeyboardType.NumberPad
  49. self.view.addSubview(QQNumber)
  50. self.QQNumber = QQNumber
  51.  
  52. /// 密码输入提示,暂时没用到
  53. var passText = UILabel(frame: CGRectMake(30, 300, UIScreen.mainScreen().bounds.size.width-60, 30))
  54. passText.text = ""
  55. self.view.addSubview(passText)
  56.  
  57. /// 密码输入框
  58. var PassNumber = UITextField(frame: CGRectMake(30, 200, UIScreen.mainScreen().bounds.size.width-60, 30))
  59. PassNumber.placeholder = " password"
  60. PassNumber.layer.borderWidth = 2
  61. PassNumber.layer.borderColor = UIColor.lightGrayColor().CGColor
  62. PassNumber.layer.cornerRadius = 5
  63. self.view.addSubview(PassNumber)
  64. self.PassNumber = PassNumber
  65.  
  66. /// 密码找回
  67. var button = UIButton(frame: CGRectMake(200, 360, 120, 30))
  68. UIButton.buttonWithType(UIButtonType.Custom)
  69. button.setTitle("忘记密码", forState: UIControlState.Normal)
  70. button.setTitleColor(UIColor.lightGrayColor(), forState: UIControlState.Normal)
  71. self.view.addSubview(button)
  72. button.addTarget(self, action: "onClick", forControlEvents: UIControlEvents.TouchUpInside)
  73.  
  74. }
  75.  
  76. /// 密码找回方法实现
  77. func onClick()
  78. {
  79.  
  80. ///找回密码提示
  81. UIAlertView(title: "温馨提示", message: "新密码已发送至手机上", delegate: nil, cancelButtonTitle: "确定", otherButtonTitles: "取消").show()
  82. }
  83. /**
  84. 点击界面键盘辞去第一响应者
  85. */
  86. override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
  87. {
  88.  
  89. self.QQNumber.resignFirstResponder()
  90. self.PassNumber.resignFirstResponder()
  91. }
  92.  
  93. }

实现根据xml进行布局:

  1. import UIkit
  2.  
  3. class LoginViewController : UIViewController,NSXMLParserDelegate
  4.  
  5. {
  6.  
  7. ///
  8.  
  9. /// 定义属性
  10.  
  11. var m_Username = UITextField()
  12.  
  13. var m_Password = UITextField()
  14.  
  15. var m_backgroundRect = CGRectMake(0,0,0,0)
  16.  
  17. var m_UsernameRect = CGRectMake(0,0,0,0)
  18.  
  19. var m_PassWordRect = CGRectMake(0,0,0,0)
  20.  
  21. var m_ConnectRect = CGRectMake(0,0,0,0)
  22.  
  23. var m_ForgetRect = CGRectMake(0,0,0,0)
  24.  
  25. var myActivityIndicator: UIActivityIndicatorView!
  26.  
  27. override func viewDidLoad()
  28.  
  29. {
  30.  
  31. self.view.backgroundColor = UIColor.whiteColor()
  32.  
  33. super.viewDidLoad()
  34.  
  35. var parser = NSXMLParser(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("LoginLayout", ofType: "xml")!))
  36.  
  37. parser?.delegate = self
  38.  
  39. parser?.parse()
  40.  
  41. // 添加头图片
  42.  
  43. [self .addAllSubViews()];
  44.  
  45. }
  46.  
  47. // 添加所有子控件
  48.  
  49. func addAllSubViews()
  50.  
  51. {
  52.  
  53. /// 平铺背景
  54.  
  55. // var headImage = UIImageView(frame: m_backgroundRect)
  56.  
  57. // headImage.image = UIImage(named:"background.jpg")
  58.  
  59. //self.view.addSubview(headImage)
  60.  
  61. //float lightblue[]={0.6824f, 0.7882f, 1.0f, 1.0f};
  62.  
  63. //var color = CGColorCreate(CGColorSpaceCreateDeviceRGB(), myColor)
  64.  
  65. ServerAddress.layer.borderColor = UIColor.blackColor().CGColor
  66.  
  67. ServerAddress.layer.cornerRadius = 5
  68.  
  69. self.view.addSubview(ServerAddress)
  70.  
  71. self.m_ServerAddress = ServerAddress
  72.  
  73. /// username input textbox
  74.  
  75. var Username = UITextField(frame: m_UsernameRect)
  76.  
  77. Username.placeholder = " username"
  78.  
  79. Username.layer.borderWidth = 2
  80.  
  81. Username.layer.borderColor = UIColor.blackColor().CGColor
  82.  
  83. Username.layer.cornerRadius = 5
  84.  
  85. self.view.addSubview(Username)
  86.  
  87. self.m_Username = Username
  88.  
  89. /// password input textbox
  90.  
  91. var Password = UITextField(frame: m_PassWordRect)
  92.  
  93. Password.placeholder = " password"
  94.  
  95. Password.layer.borderWidth = 2
  96.  
  97. Password.layer.borderColor = UIColor.blackColor().CGColor
  98.  
  99. Password.layer.cornerRadius = 5
  100.  
  101. self.view.addSubview(Password)
  102.  
  103. self.m_Password = Password
  104.  
  105. /// confirm the connection button
  106.  
  107. var confirmbutton = UIButton(frame: m_ConnectRect)
  108.  
  109. UIButton.buttonWithType(UIButtonType.Custom)
  110.  
  111. confirmbutton.setTitle("Connect", forState: UIControlState.Normal)
  112.  
  113. confirmbutton.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)
  114.  
  115. self.view.addSubview(confirmbutton)
  116.  
  117. confirmbutton.addTarget(self, action: "onClickConfirm", forControlEvents: UIControlEvents.TouchUpInside)
  118.  
  119. /// findback password button
  120.  
  121. var button = UIButton(frame: m_ForgetRect)
  122.  
  123. UIButton.buttonWithType(UIButtonType.Custom)
  124.  
  125. button.setTitle("Forget password!", forState: UIControlState.Normal)
  126.  
  127. button.setTitleColor(UIColor.lightGrayColor(), forState: UIControlState.Normal)
  128.  
  129. self.view.addSubview(button)
  130.  
  131. button.addTarget(self, action: "onClickFindPasswordBack", forControlEvents: UIControlEvents.TouchUpInside)
  132.  
  133. // myActivityIndicator = UIActivityIndicatorView()
  134.  
  135. //myActivityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
  136.  
  137. //myActivityIndicator.center = self.view.center;
  138.  
  139. myActivityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .White)
  140.  
  141. myActivityIndicator.frame = CGRectMake(self.view.frame.size.width/2 - 50, 250, 100, 100)
  142.  
  143. myActivityIndicator.color = UIColor.blackColor()
  144.  
  145. self.view.addSubview(myActivityIndicator);
  146.  
  147. }
  148.  
  149. ///on confirm connettion
  150.  
  151. func onClickConfirm()
  152.  
  153. {
  154.  
  155. ///check if ip,username,passname is correct
  156.  
  157. println(m_ServerAddress.text)
  158.  
  159. //eares the space before and after
  160.  
  161. }
  162.  
  163. /// 密码找回方法实现
  164.  
  165. func onClickFindPasswordBack()
  166.  
  167. {
  168.  
  169. ///找回密码提示, otherButtonTitles: "取消"这个参数如何传进去?
  170.  
  171. UIAlertView(title: "温馨提示", message: "新密码已发送至手机上", delegate: nil, cancelButtonTitle: "确定").show()
  172.  
  173. }
  174.  
  175. /**
  176.  
  177. 点击界面键盘辞去第一响应者
  178.  
  179. */
  180.  
  181. override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
  182.  
  183. {
  184.  
  185. self.m_Username.resignFirstResponder()
  186.  
  187. self.m_Password.resignFirstResponder()
  188.  
  189. }
  190.  
  191. var currentNodeName:String!
  192.  
  193. func parser(parser: NSXMLParser, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!)
  194.  
  195. {
  196.  
  197. currentNodeName = elementName
  198.  
  199. //review the code using swith
  200.  
  201. if elementName == "background"
  202.  
  203. {
  204.  
  205. let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)
  206.  
  207. let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)
  208.  
  209. let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)
  210.  
  211. let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)
  212.  
  213. m_backgroundRect = CGRectMake(x,y,Width,Height)
  214.  
  215. }
  216.  
  217. else if(elementName == "ServerAddress")
  218.  
  219. {
  220.  
  221. let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)
  222.  
  223. let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)
  224.  
  225. let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)
  226.  
  227. let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)
  228.  
  229. m_ServerAddressRect = CGRectMake(x,y,Width,Height)
  230.  
  231. }
  232.  
  233. else if(elementName == "Username")
  234.  
  235. {
  236.  
  237. let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)
  238.  
  239. let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)
  240.  
  241. let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)
  242.  
  243. let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)
  244.  
  245. m_UsernameRect = CGRectMake(x,y,Width,Height)
  246.  
  247. }
  248.  
  249. else if(elementName == "Password")
  250.  
  251. {
  252.  
  253. let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)
  254.  
  255. let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)
  256.  
  257. let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)
  258.  
  259. let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)
  260.  
  261. m_PassWordRect = CGRectMake(x,y,Width,Height)
  262.  
  263. }
  264.  
  265. else if(elementName == "Connect")
  266.  
  267. {
  268.  
  269. let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)
  270.  
  271. let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)
  272.  
  273. let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)
  274.  
  275. let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)
  276.  
  277. m_ConnectRect = CGRectMake(x,y,Width,Height)
  278.  
  279. }
  280.  
  281. else if(elementName == "Forget")
  282.  
  283. {
  284.  
  285. let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)
  286.  
  287. let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)
  288.  
  289. let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)
  290.  
  291. let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)
  292.  
  293. m_ForgetRect = CGRectMake(x,y,Width,Height)
  294.  
  295. }
  296.  
  297. }
  298.  
  299. func parser(parser: NSXMLParser, foundCharacters string: String!) {
  300.  
  301. // println(string)
  302.  
  303. var str = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
  304.  
  305. if str != ""{
  306.  
  307. println("current node : \(currentNodeName),value : \(str)")
  308.  
  309. }
  310.  
  311. }
  312.  
  313. override func didReceiveMemoryWarning() {
  314.  
  315. super.didReceiveMemoryWarning()
  316.  
  317. // Dispose of any resources that can be recreated.
  318.  
  319. }
  320.  
  321. lazy var m_connect: ConnectServer? = {
  322.  
  323. return ConnectServer()
  324.  
  325. }()
  326.  
  327. }

xml:

  1. <LoginLayout>
  2. <background x="0" y="0" Width="400" Height="800">
  3. <Image name="background.jpg"> </Image>
  4. </background>
  5.  
  6. <Username x="30" y="150" Width="300" Height="30">
  7. </Username>
  8. <Password x="30" y="200" Width="300" Height="30">
  9. </Password>
  10.  
  11. <Connect x="30" y="250" Width="100" Height="30">
  12. </Connect>
  13.  
  14. <Forget x="200" y="250" Width="200" Height="30">
  15. </Forget>
  16. </LoginLayout>

对xml解析类的封装:

NSXMLParser(data: data),这个有几种初始化的方法,但是string就不行,得转换成NSdata,还是比较蛋疼的

  1. //
  2. // VMXMLParser.swift
  3. // XMLParserTest
  4. //
  5. // Created by Jimmy Jose on 22/08/14.
  6. //https://github.com/varshylmobile/VMXMLParser
  7. // Permission is hereby granted, free of charge, to any person obtaining a copy
  8. // of this software and associated documentation files (the "Software"), to deal
  9. // in the Software without restriction, including without limitation the rights
  10. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. // copies of the Software, and to permit persons to whom the Software is
  12. // furnished to do so, subject to the following conditions:
  13. //
  14. // The above copyright notice and this permission notice shall be included in
  15. // all copies or substantial portions of the Software.
  16. //
  17. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23. // THE SOFTWARE.
  24.  
  25. import Foundation
  26.  
  27. // Todo: Add documentation
  28. class VMXMLParser: NSObject,NSXMLParserDelegate{
  29.  
  30. private let kParserError = "Parser Error"
  31. private var activeElement = ""
  32. private var previousElement = "-1"
  33. private var previousElementValue = ""
  34. private var arrayFinalXML = NSMutableArray()
  35. private var dictFinalXML = NSMutableDictionary()
  36. private var completionHandler:((tags:NSArray?, error:String?)->Void)?
  37.  
  38. var lameMode = true
  39.  
  40. var reoccuringTag:NSString = ""
  41. var m_Projects:[String] = []
  42. /**
  43. Initializes a new parser with url of NSURL type.
  44.  
  45. :param: url The url of xml file to be parsed
  46. :param: completionHandler The completion handler
  47.  
  48. :returns: Void.
  49. */
  50.  
  51. override init() {
  52.  
  53. super.init()
  54.  
  55. }
  56.  
  57. func parseXMLFromURL(url:NSURL,takeChildOfTag:NSString,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){
  58.  
  59. self.reoccuringTag = takeChildOfTag
  60. VMXMLParser().initWithURL(url, completionHandler: completionHandler)
  61.  
  62. }
  63.  
  64. func parseXMLFromURLString(urlString:NSString,takeChildOfTag:NSString,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){
  65. self.reoccuringTag = takeChildOfTag
  66.  
  67. initWithURLString(urlString, completionHandler: completionHandler)
  68. }
  69.  
  70. func parseXMLFromData(data:NSData,takeChildOfTag:NSString,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){
  71. self.reoccuringTag = takeChildOfTag
  72. initWithContentsOfData(data, completionHandler:completionHandler)
  73.  
  74. }
  75.  
  76. class func initParserWithURL(url:NSURL,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){
  77.  
  78. VMXMLParser().initWithURL(url, completionHandler: completionHandler)
  79.  
  80. }
  81.  
  82. class func initParserWithURLString(urlString:NSString,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){
  83.  
  84. VMXMLParser().initWithURLString(urlString, completionHandler: completionHandler)
  85. }
  86.  
  87. class func initParserWithData(data:NSData,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){
  88.  
  89. VMXMLParser().initWithContentsOfData(data, completionHandler:completionHandler)
  90.  
  91. }
  92.  
  93. private func initWithURL(url:NSURL,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil) -> AnyObject {
  94.  
  95. parseXMLForUrl(url :url, completionHandler: completionHandler)
  96.  
  97. return self
  98.  
  99. }
  100.  
  101. private func initWithURLString(urlString :NSString,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil) -> AnyObject {
  102.  
  103. let url = NSURL(string: urlString as String)!
  104. parseXMLForUrl(url :url, completionHandler: completionHandler)
  105.  
  106. return self
  107. }
  108.  
  109. private func initWithContentsOfData(data:NSData,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil) -> AnyObject {
  110.  
  111. initParserWith(data: data)
  112.  
  113. return self
  114.  
  115. }
  116.  
  117. private func parseXMLForUrl(#url:NSURL,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){
  118.  
  119. self.completionHandler = completionHandler
  120.  
  121. beginParsingXMLForUrl(url)
  122.  
  123. }
  124.  
  125. private func beginParsingXMLForUrl(url:NSURL){
  126.  
  127. let request:NSURLRequest = NSURLRequest(URL:url)
  128.  
  129. let queue:NSOperationQueue = NSOperationQueue()
  130.  
  131. NSURLConnection.sendAsynchronousRequest(request,queue:queue,completionHandler:{response,data,error in
  132.  
  133. if(error != nil){
  134. if(self.completionHandler != nil){
  135. self.completionHandler?(tags:nil,error:error.localizedDescription)
  136. }
  137.  
  138. }else{
  139.  
  140. self.initParserWith(data: data)
  141.  
  142. }})
  143. }
  144.  
  145. private func initParserWith(#data:NSData){
  146.  
  147. var parser = NSXMLParser(data: data)
  148. parser.delegate = self
  149.  
  150. var success:Bool = parser.parse()
  151.  
  152. if success {
  153.  
  154. if(self.arrayFinalXML.count > 0)
  155. {
  156. if(self.completionHandler != nil)
  157. {
  158. self.completionHandler?(tags:self.arrayFinalXML,error:nil)
  159. }
  160. }
  161.  
  162. }
  163. else
  164. {
  165.  
  166. if(self.completionHandler != nil)
  167. {
  168. self.completionHandler?(tags:nil,error:kParserError)
  169. }
  170. }
  171.  
  172. }
  173.  
  174. internal func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
  175. activeElement = elementName;
  176. println(elementName)
  177. if elementName == "Project"
  178. {
  179. let name = (attributeDict["Name"]! as String )
  180. println(name)
  181. m_Projects.append(name)
  182.  
  183. }
  184.  
  185. if(reoccuringTag.isEqualToString(elementName)){
  186.  
  187. dictFinalXML = NSMutableDictionary()
  188. }
  189. }
  190.  
  191. internal func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
  192.  
  193. if(reoccuringTag.length == 0){
  194. if((dictFinalXML.objectForKey(activeElement)) != nil){
  195.  
  196. arrayFinalXML.addObject(dictFinalXML)
  197. dictFinalXML = NSMutableDictionary()
  198.  
  199. }else{
  200.  
  201. dictFinalXML.setValue(previousElementValue, forKey: activeElement)
  202. }
  203. }else{
  204. //println(elementName)
  205. if(reoccuringTag.isEqualToString(elementName)){
  206.  
  207. arrayFinalXML.addObject(dictFinalXML)
  208. dictFinalXML = NSMutableDictionary()
  209.  
  210. }else{
  211.  
  212. dictFinalXML.setValue(previousElementValue, forKey: activeElement)
  213.  
  214. }
  215.  
  216. }
  217.  
  218. previousElement = "-1"
  219. previousElementValue = ""
  220.  
  221. }
  222.  
  223. internal func parser(parser: NSXMLParser, foundCharacters string: String?) {
  224.  
  225. if var str = string as NSString? {
  226. str = str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
  227.  
  228. if((previousElement as NSString).isEqualToString("-1")){
  229.  
  230. previousElement = activeElement
  231. previousElementValue = str as String
  232.  
  233. }else{
  234.  
  235. if((previousElement as NSString).isEqualToString(activeElement)){
  236.  
  237. previousElementValue = previousElementValue + (str as String)
  238.  
  239. }else{
  240.  
  241. previousElement = activeElement
  242. previousElementValue = str as String
  243. }
  244. }
  245. }
  246. }
  247.  
  248. internal func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
  249. if(self.completionHandler != nil){
  250. self.completionHandler?(tags:nil,error:parseError.localizedDescription)
  251. }
  252. }
  253.  
  254. }

ios swift模仿qq登陆界面,xml布局的更多相关文章

  1. Qt 之 模仿 QQ登陆界面——样式篇

    一.简述 今天晚上花了半天时间从QQ登录界面抠了些图,顺便加了点样式基本上实现了QQ的登陆界面全部效果.虽不说100%相似,那也有99.99%相似了哈O(∩_∩)O. QQ好像从去年开始,登录界面有了 ...

  2. [转]Android:布局实例之模仿QQ登录界面

    Android:布局实例之模仿QQ登录界面 预览图: 准备: 1.找到模仿对象 QQ登陆界面UI下载>>>>> 2.导入工程 3.查看布局结构和使用控件 其对应效果图分布 ...

  3. Android:布局实例之模仿QQ登录界面

    预览图: 准备: 1.找到模仿对象 QQ登陆界面UI下载>>>>> 2.导入工程 3.查看布局结构和使用控件 其对应效果图分布为 4.分析样式选择器 下拉箭头2种样式:点 ...

  4. [iOS基础控件 - 3.1] QQ登陆界面

      A.storyboard 控件版 1.label 2.textfield      a.Keyboard Type           账号:Number Pad           密码:Num ...

  5. WPF和Expression Blend开发实例:模拟QQ登陆界面打开和关闭特效

    不管在消费者的心中腾讯是一个怎么样的模仿者抄袭者的形象,但是腾讯在软件交互上的设计一直是一流的.正如某位已故的知名产品经理所说的:设计并非外观怎样,感觉如何.设计的是产品的工作原理.我觉得腾讯掌握了其 ...

  6. QQ聊天界面的布局和设计(IOS篇)-第二季

    QQChat Layout - 第二季 本来第二季是快写好了, 也花了点功夫, 结果gitbook出了点问题, 给没掉了.有些细节可能会一带而过, 如有疑问, 相互交流进步~. 在第一季中我们完成了Q ...

  7. QQ聊天界面的布局和设计(IOS篇)-第一季

    我写的源文件整个工程会再第二季中发上来~,存在百度网盘, 感兴趣的童鞋, 可以关注我的博客更新,到时自己去下载~.喵~~~ QQChat Layout - 第一季 一.准备工作 1.将假数据messa ...

  8. java代码完全手写模仿qq登录界面

    这是我模仿QQ2015版界面,实现的基本功能有登陆验证,重置等,当然直接复制代码运行是不一样的,还要注意自己插入自己的图片. 结果截图如下所示: import java.awt.BorderLayou ...

  9. 浅谈HTML之模仿人人网登陆界面(新手必学)

    为方便大家对web相关知识的了解,现谈谈新手如何从HTML css  Javascript到以后后台的发展.首先,让大家看看HTML仿人人登陆界面: <!doctype html> < ...

随机推荐

  1. 解决Popup StayOpen=true时,永远置顶的问题

    Popup设置了StayOpen=true时,会置顶显示. 如弹出了Popup后,打开QQ窗口,Popup显示在QQ聊天界面之上. 怎么解决问题? 获取绑定UserControl所在的窗口,窗口层级变 ...

  2. Go 语言多维数组

    Go 语言支持多维数组,以下为常用的多维数组声明方式: var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type 以下实例声明了三维的整型数组: ...

  3. render函数data参数中的model选项

    官方文档没有说, 但是编译v-model时, 是有model这个选项的, 例如: _c('el-input', { attrs: { "placeholder": "手机 ...

  4. UE4使用UMG接口操作界面

    原文链接:http://gad.qq.com/article/detail/7181131 本文首发腾讯GAD开发者平台,未经允许,不得转载 UE4的蓝图之强大让人欲罢不能,但是实际在项目的开发中,C ...

  5. 初识Spring Boot框架(二)之DIY一个Spring Boot的自动配置

    在上篇博客初识Spring Boot框架中我们初步见识了SpringBoot的方便之处,很多小伙伴可能也会好奇这个Spring Boot是怎么实现自动配置的,那么今天我就带小伙伴我们自己来实现一个简单 ...

  6. Objective-C点语法

    Objective-C点语法 点语法可以简单的理解成是为了让Java等语言的开发人员能够快速适应OC语言而添加的一个新写法 因为Java里没有指针,也没有[xxx xxx]这种调用方式,都是使用点xx ...

  7. TeamView 无法捕捉画面问题的解决办法

    teamview是个非常不错的远程协助软件,你要是在项目中还搞个QQ远程协助啥的就显的非常不专业了. 在teamview连接远程后,看到的是一片漆黑,中间框提示"现在无法捕捉画面.这可能是由 ...

  8. “出错了”和报告Bug的艺术

    "出错了." 没有那句话能像"出错了"一样让程序员/开发者如此沮丧,心里翻江倒海,怒火一点即燃,还要死掉一大片脑细胞. 这句生硬的开场白通常标志着让开发者恐惧的 ...

  9. Android开发艺术探索——第二章:IPC机制(上)

    Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化 ...

  10. React Native之ViewPagerAndroid 组件

    概述 今天我们来讲解一下关于 ViewPager 的使用,它是一个允许子视图左右滚动翻页的容器.我们知道在Android开发中系统有ViewPager这个组件,作用是实现滚动翻页的,在RN中也是有这么 ...