iOS開(kāi)發(fā) - 自定義主頁(yè)菜單選擇視圖

下面簡(jiǎn)單仿下現(xiàn)在流行的主頁(yè)菜單選擇布局大诸,原理很簡(jiǎn)單,不過(guò)下面這個(gè)是固定樣式的资柔,大家有時(shí)間的話焙贷,可以自己按照需求改成動(dòng)態(tài)的。
Simulator Screen Shot 2016年6月21日 下午11.00.15.png
Menu.gif

MenuView.swift

import UIKit

struct MenuModel {
    
   static let menuArr = [(1,title:"sunbed", imageUrl:"sunbed"),
                   (2,title:"bag", imageUrl:"bag-1"),
                   (3,title:"cocktail", imageUrl:"cocktail"),
                   (4,title:"cruise", imageUrl:"cruise"),
                   (5,title:"f-flops", imageUrl:"flip-flops-1"),
                   (6,title:"helm", imageUrl:"helm"),
                   (7,title:"bellhop", imageUrl:"bellhop"),
                   (8,title:"aqualung", imageUrl:"aqualung-1"),
                   (9,title:"gps", imageUrl:"gps"),
                   (10,title:"igloo", imageUrl:"igloo"),
                   (11,title:"lifebuoy", imageUrl:"lifebuoy"),
                   (12,title:"luggage", imageUrl:"luggage"),
                   (13,title:"oxygen-tank", imageUrl:"oxygen-tank"),
                   (14,title:"ring", imageUrl:"ring"),
                   (15,title:"seashell", imageUrl:"seashell"),
                   (16,title:"snorkel", imageUrl:"snorkel"),
                   (17,title:"protection", imageUrl:"sun-protection"),
                   (18,title:"castle", imageUrl:"sand-castle"),
                   (19,title:"service", imageUrl:"room-service"),
                   (20,title:"castle", imageUrl:"sand-castle")]
}

protocol MenuViewDelegate {
    func menuDidSelectedAtIndex(index: Int)
}

class MenuView: UIView {
    
    // MARK: - 屬性
   private let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width
   private let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height

   private var backView1 = UIView()
   private var backView2 = UIView()
   private var pageControl = UIPageControl()
    
   var delegate: MenuViewDelegate? //找個(gè)代理
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        self.initWithMenuView()
        self.initPageControl()
    }
   
   // MARK: - 初始化視圖
   private func initWithMenuView() {
        
        backView1.frame = CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: 160)
        backView2.frame = CGRect(x: SCREEN_WIDTH, y: 0, width: SCREEN_WIDTH, height: 160)
        let scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: 180))
        scrollView.contentSize = CGSizeMake(2 * SCREEN_WIDTH, 180)
        scrollView.pagingEnabled = true
        scrollView.delegate = self
        scrollView.showsVerticalScrollIndicator = false
        scrollView.showsHorizontalScrollIndicator = false
        
        scrollView.addSubview(backView1)
        scrollView.addSubview(backView2)
        self.addSubview(scrollView)
        
        for i in 0..<20 {
            var frame = CGRect()
            switch i {
            case 0..<5:
                frame = CGRect(x: CGFloat(i) * SCREEN_WIDTH/5, y: 0, width: SCREEN_WIDTH/5, height: 80)
            case 5..<10:
                frame = CGRect(x: CGFloat(i - 5) * SCREEN_WIDTH/5, y: 80, width: SCREEN_WIDTH/5, height: 80)
            case 10..<15:
                frame = CGRect(x: CGFloat(i - 10) * SCREEN_WIDTH/5, y: 0, width: SCREEN_WIDTH/5, height: 80)
            case 15..<20:
                frame = CGRect(x: CGFloat(i - 15) * SCREEN_WIDTH/5, y: 80, width: SCREEN_WIDTH/5, height: 80)
            default:
                break
            }
            self.generateTheview(frame, index: i)
        }
    }
    
   private func generateTheview(frame: CGRect, index: Int) {
        let frame = frame
        let title = MenuModel.menuArr[index].title
        let imagestr = MenuModel.menuArr[index].imageUrl
        
        let AmenuView = UIView(frame: frame)
        AmenuView.tag = MenuModel.menuArr[index].0 //tag值從1開(kāi)始
        
        if index < 10 {
            backView1.addSubview(AmenuView)
        } else {
            backView2.addSubview(AmenuView)
        }
        //手勢(shì)
        let tap = UITapGestureRecognizer(target: self, action: #selector(MenuView.OnTapMenuView(_:)))
        AmenuView.addGestureRecognizer(tap)
        
        let frameW = frame.size.width
        let _ = frame.size.height
        
        //圖片
        let imageView = UIImageView(frame: CGRect(x: frameW/2 - 20, y: 20, width: 40, height: 40))
        imageView.image = UIImage(named: imagestr)
        AmenuView.addSubview(imageView)
        //文字
        let tiltelabel = UILabel(frame: CGRect(x: 0, y: imageView.frame.height + 20, width: frameW, height: 20))
        tiltelabel.font = UIFont.systemFontOfSize(12)
        tiltelabel.textAlignment = .Center
        tiltelabel.text = title
        AmenuView.addSubview(tiltelabel)
    }
    
    // 初始化 pageControl
   private func initPageControl()  {
        pageControl.frame = CGRect(x: SCREEN_WIDTH/2, y: 160, width: 0, height: 20)
        pageControl.currentPage = 0
        pageControl.numberOfPages = 2
        self.addSubview(pageControl)
        pageControl.currentPageIndicatorTintColor = UIColor.brownColor()
        pageControl.pageIndicatorTintColor = UIColor.grayColor()
    }
    
    //MARK: - 方法  代理回傳
   func OnTapMenuView(sender: UITapGestureRecognizer) {
        let index = sender.view?.tag ?? 0
        self.delegate?.menuDidSelectedAtIndex(index)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

extension MenuView: UIScrollViewDelegate {
   func scrollViewDidScroll(scrollView: UIScrollView) {
        let scrollViewW = scrollView.frame.size.width
        let x = scrollView.contentOffset.x
        let page = (x + scrollViewW/2) / scrollViewW
        pageControl.currentPage = Int(page)
    }
}

使用例子:ViewController.swift

import UIKit

class ViewController: UIViewController,MenuViewDelegate {

    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let menuView = MenuView(frame: CGRect(x: 0, y: 20, width: self.view.frame.width, height: 200))
        self.view.addSubview(menuView)
        menuView.delegate = self
    }
    
    func menuDidSelectedAtIndex(index: Int) {
        print(index)
        //imageView.image = UIImage(named: MenuModel.menuArr[index-1].imageUrl)
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市庶灿,隨后出現(xiàn)的幾起案子吃衅,更是在濱河造成了極大的恐慌往踢,老刑警劉巖捐晶,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異山上,居然都是意外死亡英支,警方通過(guò)查閱死者的電腦和手機(jī)佩憾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門妄帘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)池凄,“玉大人抡驼,你說(shuō)我怎么就攤上這事肿仑。” “怎么了馏锡?”我有些...
    開(kāi)封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵伟端,是天一觀的道長(zhǎng)杯道。 經(jīng)常有香客問(wèn)我责蝠,道長(zhǎng),這世上最難降的妖魔是什么昧港? 我笑而不...
    開(kāi)封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任支子,我火速辦了婚禮达舒,結(jié)果婚禮上值朋,老公的妹妹穿的比我還像新娘。我一直安慰自己趾代,他們只是感情好丰辣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著笙什,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芽隆。 梳的紋絲不亂的頭發(fā)上统屈,一...
    開(kāi)封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音愁憔,去河邊找鬼。 笑死半抱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的代虾。 我是一名探鬼主播激蹲,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼乘瓤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起衙傀,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤萨咕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钙畔,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡金麸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年挥下,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揍魂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棚瘟。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖步责,靈堂內(nèi)的尸體忽然破棺而出禀苦,到底是詐尸還是另有隱情蔓肯,我是刑警寧澤振乏,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站调限,受9級(jí)特大地震影響误澳,放射性物質(zhì)發(fā)生泄漏耻矮。R本人自食惡果不足惜忆谓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一倡缠、第九天 我趴在偏房一處隱蔽的房頂上張望哨免。 院中可真熱鬧昙沦,春花似錦、人聲如沸盾饮。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至泌豆,卻和暖如春吏饿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猪落。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工笨忌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蓝仲,地道東北人官疲。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像垢夹,于是被迫代替她去往敵國(guó)和親维费。 傳聞我的和親對(duì)象是個(gè)殘疾皇子果元,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)而晒、插件阅畴、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,109評(píng)論 4 62
  • 我說(shuō)我要堅(jiān)持每周寫一篇簡(jiǎn)書,雖然這看起來(lái)太簡(jiǎn)單了恶阴,但是當(dāng)適逢我這周四天走6個(gè)城市的出差節(jié)奏來(lái)說(shuō),還是有點(diǎn)挑戰(zhàn)體力的...
    家中的阿雅閱讀 363評(píng)論 1 0