ios 仿电脑qq登录界面_ios swift模仿qq登陆界面,xml布局

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

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

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

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

代码:

//

// LoginViewController.swift

// IBM_LOGIN

//

// Created by dcintern on 6/26/15.

// Copyright (c) 2015 dcintern. All rights reserved.

//

//import Foundation

import UIKit

class LoginViewController: UIViewController

{

/// 定义属性

var QQNumber = UITextField()

var PassNumber = UITextField()

override func viewDidLoad() {

self.view.backgroundColor = UIColor.whiteColor()

super.viewDidLoad()

// 添加头图片

[self .addAllSubViews()];

}

// 添加所有子控件

func addAllSubViews(){

/// 平铺背景

var headImage = UIImageView(frame: CGRectMake(0,0, 400, 800))

headImage.image = UIImage(named:"123.jpeg")

self.view.addSubview(headImage)

/// QQ号输入提示,暂时没有用到

var phoneText = UILabel(frame: CGRectMake(30, 240, UIScreen.mainScreen().bounds.size.width-60, 30))

phoneText.text = ""

self.view.addSubview(phoneText)

/// QQ号输入框

var QQNumber = UITextField(frame: CGRectMake(30, 150, UIScreen.mainScreen().bounds.size.width-60, 30))

QQNumber.placeholder = " username"

QQNumber.layer.borderWidth = 2

QQNumber.layer.borderColor = UIColor.lightGrayColor().CGColor

QQNumber.layer.cornerRadius = 5

QQNumber.keyboardType = UIKeyboardType.NumberPad

self.view.addSubview(QQNumber)

self.QQNumber = QQNumber

/// 密码输入提示,暂时没用到

var passText = UILabel(frame: CGRectMake(30, 300, UIScreen.mainScreen().bounds.size.width-60, 30))

passText.text = ""

self.view.addSubview(passText)

/// 密码输入框

var PassNumber = UITextField(frame: CGRectMake(30, 200, UIScreen.mainScreen().bounds.size.width-60, 30))

PassNumber.placeholder = " password"

PassNumber.layer.borderWidth = 2

PassNumber.layer.borderColor = UIColor.lightGrayColor().CGColor

PassNumber.layer.cornerRadius = 5

self.view.addSubview(PassNumber)

self.PassNumber = PassNumber

/// 密码找回

var button = UIButton(frame: CGRectMake(200, 360, 120, 30))

UIButton.buttonWithType(UIButtonType.Custom)

button.setTitle("忘记密码", forState: UIControlState.Normal)

button.setTitleColor(UIColor.lightGrayColor(), forState: UIControlState.Normal)

self.view.addSubview(button)

button.addTarget(self, action: "onClick", forControlEvents: UIControlEvents.TouchUpInside)

}

/// 密码找回方法实现

func onClick()

{

///找回密码提示

UIAlertView(title: "温馨提示", message: "新密码已发送至手机上", delegate: nil, cancelButtonTitle: "确定", otherButtonTitles: "取消").show()

}

/**

点击界面键盘辞去第一响应者

*/

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)

{

self.QQNumber.resignFirstResponder()

self.PassNumber.resignFirstResponder()

}

}

实现根据xml进行布局:

import UIkit

class LoginViewController : UIViewController,NSXMLParserDelegate

{

///

/// 定义属性

var m_Username = UITextField()

var m_Password = UITextField()

var m_backgroundRect = CGRectMake(0,0,0,0)

var m_UsernameRect = CGRectMake(0,0,0,0)

var m_PassWordRect = CGRectMake(0,0,0,0)

var m_ConnectRect = CGRectMake(0,0,0,0)

var m_ForgetRect = CGRectMake(0,0,0,0)

var myActivityIndicator: UIActivityIndicatorView!

override func viewDidLoad()

{

self.view.backgroundColor = UIColor.whiteColor()

super.viewDidLoad()

var parser = NSXMLParser(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("LoginLayout", ofType: "xml")!))

parser?.delegate = self

parser?.parse()

// 添加头图片

[self .addAllSubViews()];

}

// 添加所有子控件

func addAllSubViews()

{

/// 平铺背景

// var headImage = UIImageView(frame: m_backgroundRect)

// headImage.image = UIImage(named:"background.jpg")

//self.view.addSubview(headImage)

//float lightblue[]={0.6824f, 0.7882f, 1.0f, 1.0f};

//var color = CGColorCreate(CGColorSpaceCreateDeviceRGB(), myColor)

ServerAddress.layer.borderColor = UIColor.blackColor().CGColor

ServerAddress.layer.cornerRadius = 5

self.view.addSubview(ServerAddress)

self.m_ServerAddress = ServerAddress

/// username input textbox

var Username = UITextField(frame: m_UsernameRect)

Username.placeholder = " username"

Username.layer.borderWidth = 2

Username.layer.borderColor = UIColor.blackColor().CGColor

Username.layer.cornerRadius = 5

self.view.addSubview(Username)

self.m_Username = Username

/// password input textbox

var Password = UITextField(frame: m_PassWordRect)

Password.placeholder = " password"

Password.layer.borderWidth = 2

Password.layer.borderColor = UIColor.blackColor().CGColor

Password.layer.cornerRadius = 5

self.view.addSubview(Password)

self.m_Password = Password

/// confirm the connection button

var confirmbutton = UIButton(frame: m_ConnectRect)

UIButton.buttonWithType(UIButtonType.Custom)

confirmbutton.setTitle("Connect", forState: UIControlState.Normal)

confirmbutton.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)

self.view.addSubview(confirmbutton)

confirmbutton.addTarget(self, action: "onClickConfirm", forControlEvents: UIControlEvents.TouchUpInside)

/// findback password button

var button = UIButton(frame: m_ForgetRect)

UIButton.buttonWithType(UIButtonType.Custom)

button.setTitle("Forget password!", forState: UIControlState.Normal)

button.setTitleColor(UIColor.lightGrayColor(), forState: UIControlState.Normal)

self.view.addSubview(button)

button.addTarget(self, action: "onClickFindPasswordBack", forControlEvents: UIControlEvents.TouchUpInside)

// myActivityIndicator = UIActivityIndicatorView()

//myActivityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray

//myActivityIndicator.center = self.view.center;

myActivityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .White)

myActivityIndicator.frame = CGRectMake(self.view.frame.size.width/2 - 50, 250, 100, 100)

myActivityIndicator.color = UIColor.blackColor()

self.view.addSubview(myActivityIndicator);

}

///on confirm connettion

func onClickConfirm()

{

///check if ip,username,passname is correct

println(m_ServerAddress.text)

//eares the space before and after

}

/// 密码找回方法实现

func onClickFindPasswordBack()

{

///找回密码提示, otherButtonTitles: "取消"这个参数如何传进去?

UIAlertView(title: "温馨提示", message: "新密码已发送至手机上", delegate: nil, cancelButtonTitle: "确定").show()

}

/**

点击界面键盘辞去第一响应者

*/

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)

{

self.m_Username.resignFirstResponder()

self.m_Password.resignFirstResponder()

}

var currentNodeName:String!

func parser(parser: NSXMLParser, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!)

{

currentNodeName = elementName

//review the code using swith

if elementName == "background"

{

let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)

let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)

let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)

let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)

m_backgroundRect = CGRectMake(x,y,Width,Height)

}

else if(elementName == "ServerAddress")

{

let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)

let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)

let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)

let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)

m_ServerAddressRect = CGRectMake(x,y,Width,Height)

}

else if(elementName == "Username")

{

let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)

let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)

let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)

let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)

m_UsernameRect = CGRectMake(x,y,Width,Height)

}

else if(elementName == "Password")

{

let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)

let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)

let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)

let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)

m_PassWordRect = CGRectMake(x,y,Width,Height)

}

else if(elementName == "Connect")

{

let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)

let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)

let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)

let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)

m_ConnectRect = CGRectMake(x,y,Width,Height)

}

else if(elementName == "Forget")

{

let x = CGFloat(((attributeDict["x"]! as String )as NSString).floatValue)

let y = CGFloat(((attributeDict["y"]! as String ) as NSString).floatValue)

let Width = CGFloat(((attributeDict["Width"]! as String )as NSString).floatValue)

let Height = CGFloat(((attributeDict["Height"]! as String ) as NSString).floatValue)

m_ForgetRect = CGRectMake(x,y,Width,Height)

}

}

func parser(parser: NSXMLParser, foundCharacters string: String!) {

// println(string)

var str = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())

if str != ""{

println("current node : \(currentNodeName),value : \(str)")

}

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// Dispose of any resources that can be recreated.

}

lazy var m_connect: ConnectServer? = {

return ConnectServer()

}()

}

xml:

对xml解析类的封装:

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

//

// VMXMLParser.swift

// XMLParserTest

//

// Created by Jimmy Jose on 22/08/14.

//https://github.com/varshylmobile/VMXMLParser

// Permission is hereby granted, free of charge, to any person obtaining a copy

// of this software and associated documentation files (the "Software"), to deal

// in the Software without restriction, including without limitation the rights

// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

// copies of the Software, and to permit persons to whom the Software is

// furnished to do so, subject to the following conditions:

//

// The above copyright notice and this permission notice shall be included in

// all copies or substantial portions of the Software.

//

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

// THE SOFTWARE.

import Foundation

// Todo: Add documentation

class VMXMLParser: NSObject,NSXMLParserDelegate{

private let kParserError = "Parser Error"

private var activeElement = ""

private var previousElement = "-1"

private var previousElementValue = ""

private var arrayFinalXML = NSMutableArray()

private var dictFinalXML = NSMutableDictionary()

private var completionHandler:((tags:NSArray?, error:String?)->Void)?

var lameMode = true

var reoccuringTag:NSString = ""

var m_Projects:[String] = []

/**

Initializes a new parser with url of NSURL type.

:param: url The url of xml file to be parsed

:param: completionHandler The completion handler

:returns: Void.

*/

override init() {

super.init()

}

func parseXMLFromURL(url:NSURL,takeChildOfTag:NSString,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){

self.reoccuringTag = takeChildOfTag

VMXMLParser().initWithURL(url, completionHandler: completionHandler)

}

func parseXMLFromURLString(urlString:NSString,takeChildOfTag:NSString,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){

self.reoccuringTag = takeChildOfTag

initWithURLString(urlString, completionHandler: completionHandler)

}

func parseXMLFromData(data:NSData,takeChildOfTag:NSString,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){

self.reoccuringTag = takeChildOfTag

initWithContentsOfData(data, completionHandler:completionHandler)

}

class func initParserWithURL(url:NSURL,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){

VMXMLParser().initWithURL(url, completionHandler: completionHandler)

}

class func initParserWithURLString(urlString:NSString,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){

VMXMLParser().initWithURLString(urlString, completionHandler: completionHandler)

}

class func initParserWithData(data:NSData,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){

VMXMLParser().initWithContentsOfData(data, completionHandler:completionHandler)

}

private func initWithURL(url:NSURL,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil) -> AnyObject {

parseXMLForUrl(url :url, completionHandler: completionHandler)

return self

}

private func initWithURLString(urlString :NSString,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil) -> AnyObject {

let url = NSURL(string: urlString as String)!

parseXMLForUrl(url :url, completionHandler: completionHandler)

return self

}

private func initWithContentsOfData(data:NSData,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil) -> AnyObject {

initParserWith(data: data)

return self

}

private func parseXMLForUrl(#url:NSURL,completionHandler:((tags:NSArray?, error:String?)->Void)? = nil){

self.completionHandler = completionHandler

beginParsingXMLForUrl(url)

}

private func beginParsingXMLForUrl(url:NSURL){

let request:NSURLRequest = NSURLRequest(URL:url)

let queue:NSOperationQueue = NSOperationQueue()

NSURLConnection.sendAsynchronousRequest(request,queue:queue,completionHandler:{response,data,error in

if(error != nil){

if(self.completionHandler != nil){

self.completionHandler?(tags:nil,error:error.localizedDescription)

}

}else{

self.initParserWith(data: data)

}})

}

private func initParserWith(#data:NSData){

var parser = NSXMLParser(data: data)

parser.delegate = self

var success:Bool = parser.parse()

if success {

if(self.arrayFinalXML.count > 0)

{

if(self.completionHandler != nil)

{

self.completionHandler?(tags:self.arrayFinalXML,error:nil)

}

}

}

else

{

if(self.completionHandler != nil)

{

self.completionHandler?(tags:nil,error:kParserError)

}

}

}

internal func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {

activeElement = elementName;

println(elementName)

if elementName == "Project"

{

let name = (attributeDict["Name"]! as String )

println(name)

m_Projects.append(name)

}

if(reoccuringTag.isEqualToString(elementName)){

dictFinalXML = NSMutableDictionary()

}

}

internal func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {

if(reoccuringTag.length == 0){

if((dictFinalXML.objectForKey(activeElement)) != nil){

arrayFinalXML.addObject(dictFinalXML)

dictFinalXML = NSMutableDictionary()

}else{

dictFinalXML.setValue(previousElementValue, forKey: activeElement)

}

}else{

//println(elementName)

if(reoccuringTag.isEqualToString(elementName)){

arrayFinalXML.addObject(dictFinalXML)

dictFinalXML = NSMutableDictionary()

}else{

dictFinalXML.setValue(previousElementValue, forKey: activeElement)

}

}

previousElement = "-1"

previousElementValue = ""

}

internal func parser(parser: NSXMLParser, foundCharacters string: String?) {

if var str = string as NSString? {

str = str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())

if((previousElement as NSString).isEqualToString("-1")){

previousElement = activeElement

previousElementValue = str as String

}else{

if((previousElement as NSString).isEqualToString(activeElement)){

previousElementValue = previousElementValue + (str as String)

}else{

previousElement = activeElement

previousElementValue = str as String

}

}

}

}

internal func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {

if(self.completionHandler != nil){

self.completionHandler?(tags:nil,error:parseError.localizedDescription)

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值