1. 程式人生 > >獻給初學iOS的小盆友們——微博app專案開發之十六搭建傳送微博介面(上)

獻給初學iOS的小盆友們——微博app專案開發之十六搭建傳送微博介面(上)

從這節課開始我們學習搭建傳送微博介面。傳送介面看起來簡單,但是卻包含了許多細節處理。所以我們分為幾節課來完成,儘量講解詳細點。

本節內容

本節程式碼資料

16.1 設定傳送介面的導航內容

當我們點選中間加號按鈕的時候,微博會彈出一個傳送介面,然後才可以編輯。介面效果如下:
這裡寫圖片描述

開發之前我們先羅列出介面的幾個細節:

  • 1 導航條的字型顏色是橘色,但“傳送”按鈕一開時是灰色,且不能點選,只有當用戶輸入文字後,才能恢復。
  • 2 輸入文字框有佔位符“分享新鮮事…”,且佔位符的字型大小應該與輸入的文字大小相等。
  • 3 當用戶點選輸入文字的時候,佔位符消失。
  • 4 剛進入傳送介面時,鍵盤是自動彈出的,如果拖拽文字輸入框,鍵盤就會消失。

下面我們根據以上這些要求,一步一步的去完成設定。
首先,建立一個YGComposeViewController,繼承自UIViewController。我們想在YGTabBarController內監聽加號按鈕的點選,當其被點選時,彈出傳送介面。這裡就需要使用代理方法,因為之前YGTabBarController就已經遵守了YGTabBar 的代理,所以我們就之前的代理內再新增一個方法。

- (void)tabBarDidClickPlusButton:(YGTabBar *)tabBar;

然後在YGTabBar內建立plus Button內的方法中監聽按鈕的點選:

[btn addTarget:
self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside]

點選加號按鈕時呼叫此方法:

#pragma mark - 點選加號按鈕時呼叫
- (void)plusClick
{
    // 彈出控制器
    if ([_delegate respondsToSelector:@selector(tabBarDidClickPlusButton:)]) {
        [_delegate tabBarDidClickPlusButton:self];
    }
}

最後我們再YGTabBarController內實現代理:

-(void)tabBarDidClickPlusButton:(YGTabBar *)tabBar
{
    // 建立傳送微博控制器
    YGComposeViewController *composeVc = [[YGComposeViewController alloc] init];
    YGNavigationController *nav = [[YGNavigationController alloc] initWithRootViewController:composeVc];

    [self presentViewController:nav animated:YES completion:nil];
}

因為我們還要設定傳送介面的導航條字型顏色,所以這裡直接用我們之前自定義的導航條(應該沒忘吧)。
此時執行專案,點選加號按鈕,就會看到一個黑色的介面顯示出來了。為了美觀,也為了讓導航條的運動不那麼明顯,這裡把控制器背景顏色設定成白色。然後我們在view DidLoad中設定導航條內容,程式碼如下:

- (void)setUpNavgationBar
{
    self.title = @"發微博";

    // left
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"取消" style:0 target:self action:@selector(dismiss)];

    // right
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn setTitle:@"傳送" forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled];
    [btn sizeToFit];
    UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithCustomView:btn];
    rightItem.enabled = NO;
    self.navigationItem.rightBarButtonItem = rightItem;

}

本來導航條的右邊按鈕的設定方法是跟左邊按鈕一樣的,但是我們試過之後發現,全域性導航條不能用文字屬性設定disable情況下的顏色,所以這裡只能使用一個新的UIButton來設定了。
[TMD,我這裡插播一句話,估計那些沒經過我同意就複製我微博的人也不會看到。沒經過我同意就轉發我微博的那些網站竟然把時間調到比我原創微博還早半天。其它我都能忍,這我忍不了啊,搞得像我是在抄襲一樣。所以這裡我宣告,我在2016年1月31號凌晨一點發布了此部落格,其它都是轉載]

16.2 自定義文字輸入框textView

首先跟大家解釋下UITextView和UITextField兩者的不同。
兩者最大的區別是:
1、UITextView支援多行輸入並且可以滾動顯示瀏覽全文,而UITextField只能單行輸入。
2、UITextView繼承自UIScrollView,UITextField繼承自UIView[UIControl]。
3、UITextview沒有placeholder屬性 UItextField有placeholder屬性
所以這裡我們選擇UITextView但是要新增一個UILabel子控制元件,用來顯示佔位符。
新建YGComposeTextView繼承自UITextView,因為我們要讓外部可以修改佔位符,所以在其標頭檔案中新增一個placeHolder (NSString)屬性。
在composeTextView中懶載入一個placeHolderLabel,程式碼如下:

- (UILabel *)placeHolderLabel
{
    if (_placeHolderLabel == nil) {

        UILabel *label = [[UILabel alloc] init];


        [self addSubview:label];

        _placeHolderLabel = label;

    }

    return _placeHolderLabel;
}

懶載入的意思就是,當控制元件有值的時候就建立,沒有就不建立,跟在init中新增是不一樣的。
過載setPlaceHolder方法:

- (void)setPlaceHolder:(NSString *)placeHolder
{
    _placeHolder = placeHolder;

    self.placeHolderLabel.text = placeHolder;
    // label的尺寸跟文字一樣
    [self.placeHolderLabel sizeToFit];
}

然後將YGComposeViewController內新增YGComposeTextView。 程式碼如下:

#pragma mark - 新增textView
- (void)setUpTextView
{
    YGComposeTextView *textView = [[YGComposeTextView alloc] initWithFrame:self.view.bounds];
    _textView = textView;
    // 設定佔位符
    textView.placeHolder = @"abc";
    [self.view addSubview:textView];  
}

但是這時候執行專案就會發現,佔位符的字型和位置,與輸入的文字不一樣,如下圖,所以我們首先要設定字型大小:
這裡寫圖片描述
我們在初始化textView時設定其字型:

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        self.font = [UIFont systemFontOfSize:13];
    }
    return self;
}

然後再重寫setFont方法,讓佔位符的字型大小與文字框的字型大小相同:

- (void)setFont:(UIFont *)font
{
    [super setFont:font];

    self.placeHolderLabel.font = font;
    [self.placeHolderLabel sizeToFit];
}

字型大小解決後,就可以解決佔位符的位置了,重寫layOutSubviews方法:

- (void)layoutSubviews
{
    [super layoutSubviews];

    self.placeHolderLabel.x = 5;
    self.placeHolderLabel.y = 8;
}

16.3 輸入時隱藏佔位符

自定義textView還有最後最後一個功能要完成,就是在輸入文字的時候自動隱藏佔位符。這裡採用通知的方法:

// 監聽文字框的輸入
    /**
     *  Observer:誰需要監聽通知
     *  name:監聽的通知的名稱
     *  object:監聽誰傳送的通知,nil:表示誰傳送我都監聽
     *
     */
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextViewTextDidChangeNotification object:nil];

當監聽到文字框文字變化時,執行textChange方法:

- (void)textChange
{
    // 判斷下textView有木有內容
    if (_textView.text.length) { // 有內容
        _textView.hidePlaceHolder = YES;
    }else{
        _textView.hidePlaceHolder = NO;
    }
}

在這裡別忘了給YGComposeTextView新增一個BOOL型別的屬性,表明外界要傳遞給它一個是否隱藏placeHolder的資訊,以便外部控制裡面的內容。
然後重寫setHidePlaceHolder:

- (void)setHidePlaceHolder:(BOOL)hidePlaceHolder
{
    _hidePlaceHolder = hidePlaceHolder;

    self.placeHolderLabel.hidden = hidePlaceHolder;

}

最後別忘了移除通知:

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

16.4 自動彈出鍵盤 與隱藏鍵盤

這個功能應該是比較基礎的內容了,首先在一開始就讓鍵盤自動彈出:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [_textView becomeFirstResponder];

}

然後在拖拽UITextView的時候,自動隱藏鍵盤。用到的方法就是讓YGComposeViewController執行UITextView 的代理方法,因為UITextView的只有在內容超過大小的時候才能拖拽,所以不要忘了在setUpTextView內設定textView允許一直可以拖拽

    // 預設允許垂直方向拖拽
    textView.alwaysBounceVertical = YES;

代理方法如下:

#pragma mark - 開始拖拽的時候呼叫
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.view endEditing:YES];
}

因為細節處理比較多,這節課就到這裡吧,請自己主動敲程式碼哦。動手與不動手對開發過程的理解差別很大的。下節課將會講解如何設定鍵盤上方的傳送的工具欄,然後傳送文字微博。

相關推薦

獻給初學iOS——app專案開發搭建傳送介面

從這節課開始我們學習搭建傳送微博介面。傳送介面看起來簡單,但是卻包含了許多細節處理。所以我們分為幾節課來完成,儘量講解詳細點。 本節內容 本節程式碼資料 16.1 設定傳送介面的導航內容 當我們點選中間加號按鈕的時候,微博會彈出一個傳送介面,

獻給初學iOS——app專案開發搭建傳送介面

今天應該是這個專案最後一次更新啦,能堅持下來的小盆友真是棒棒噠。這節課我們將會完成傳送有圖片的微博,實現微博最後一個核心功能。因為微博的功能實在太多太多了,我們不可能把微博的每個功能都一一實現。小夥伴能從中學到最精髓的東西才是最主要的,萬變不離其宗,得到處理問題

獻給初學iOS——app專案開發二自定義cell程式碼補全

上節課我們主要講解了我們是怎麼一步一步把自定義cell打通的,主要方法就是引入了MVVM檢視模型,這樣我們就可以利用檢視模型就提前把各個子控制元件的frame都計算好了。今天我們就是講如何計運算元控制元件frame,以及補全原創微博和轉發微博的設計。 本節內容

獻給初學iOS——app專案開發四設定導航功能

本節課我們主要想實現導航條的導航功能,順便要解決一些bug。學到的知識點包括控制器的轉換,和xib的使用。 主要內容 導航條導航功能 設定導航條內容 解決導航條bug 本節資料下載 4.1 導航條導航功能,並隱藏tabBar 我們這

獻給初學iOS------app專案開發之一專案初始化

獻給初學iOS的小盆友們——微博app專案開發之一 專案初始化 本人自學iOS也有七八個月了,不敢說學到很深入了,但也算入了門。此次微博app專案參考了傳智播客培訓教材,主要學習內容有架構思想,封裝思想,程式碼重構,業務邏輯等內容,專案涵蓋面廣泛,講解易懂,且

從壹開始服務 [ DDD ] 五 ║聚合:實體與值物件

前言 哈嘍,老張是週四放鬆又開始了,這些天的工作真的是繁重,三個專案同時啟動,沒辦法,只能在深夜寫文章了,現在時間的週四凌晨,白天上班已經沒有時間開始寫文章了,希望看到文章的小夥伴,能給個辛苦贊

信公眾號開發回覆圖文訊息(被動) 信公眾號開發VS遠端除錯

目錄 (一)微信公眾號開發之VS遠端除錯 (二)微信公眾號開發之基礎梳理 (三)微信公眾號開發之自動訊息回覆和自定義選單 (四)微信公眾號開發之網頁授權獲取使用者基本資訊 (五)微信公眾號開發之網頁中及時獲取當前使用者Openid及注意事項 (六)微信公眾號開發之掃碼支付 (七)微信公眾號開發之

程序組件化

== 什麽 解決方案 chan json 特性 支持 減少 ble 小程序對組件化的“支持”情況 微信小程序(以下簡稱“小程序”,版本)雖然默認定義了很多有用的組件,但是在開發小程序過程中,往往需要自定義業務組件。而小程序開發者文檔中卻未對自定義組件給出很好的解決方案或示例

程式開發手記七:一個程式上線後的總結

終於,經過大概一週時間,磕磕絆絆地提交稽核了,一個移動猿開發小程式,也算有了些心得,也遇到了些坑,這裡和大家一起分享下。 怎麼樣調佈局 先說一個題外話,最後引入正題。 如果翻看過一些資料,大家肯定很容易會發現一件事,那就是關於image標籤的預設寬高,

程式日記——高仿知乎日報

該小程式的作者是Oopsguy,我也參與小功能的開發和完善,希望大家能支援一下 本人對知乎日報是情有獨鍾,看我的部落格和github就知道了,寫了幾個不同技術型別的知乎日報APP 要做微信小程式首先要對html,css,js有一定的基礎,還有對微信小

程式線上任務釋出與接單平臺

#end time:2017/06/18系統主要功能介面執行情況及結果:系統執行環境要求及操作說明:工具:微信web開發者工具 / 申請微信小程式開發許可權系統總結和體會:    經過這次的資料庫實踐,讓我在加強掌握資料庫能力的同時,領會到了許多平時課堂上所沒有接受的課外知識

程式入門筆記

目前專案正在開發中,總結地比較少,也不全,後續會更新。 踩坑點 scroll-view標籤設定橫向滾動時,需要以下設定 設定滾動項display:inline-block; 設定滾動檢視容

信公眾平臺開發萬能表單

平臺 體驗 src .net 等等 art net 獎勵 功能 微信公眾平臺開發之萬能表單是為了方便我們得到用戶的信息。我們能夠在後臺設置不論什麽須要用戶填寫的信息,比方:電話,姓名,性別,工作等等信息,當然我們也能夠設置一定的獎勵,僅僅要完好這些信息就能夠得到一定

(6)信二次開發 信文本消息接口實現

微信 odin link 消息處理 nal puts 算法 帳號 接口實現 p.p1 { margin: 13.0px 0.0px 13.0px 0.0px; text-align: justify; font: 16.0px SimSun } p.p2 { margin:

信公眾平臺開發留言板

tracking time 方法 ref font img 建議 south data- 微信公眾平臺開發之留言板是方便用戶互相之間交流的最好方法。關註微信公號的用戶之間是不能進行對話的。為了方便用戶之間的交流留言板起到了非常大的作用。當用戶進入留言板後能夠在上面留

信公眾號開發網頁授權獲取用戶信息

還需要 開發文檔 app err 通過 casb ddt 省份 sse   這次暑假留在學校參與工作室的項目,對微信公眾號比較感興趣,所以參與這方面的學習研究。 昨天完成了關於網頁授權,獲取用戶信息方面的功能,所以乘熱打鐵,寫上一篇。實現本篇涉及的 功能,還需要完成一些基礎

Java信公眾平臺開發OAuth2.0網頁授權

col nts har 順序 pan getcount iba unionid syn 根據官方文檔點擊查看在微信公眾號請求用戶網頁授權之前,開發者需要先到公眾平臺官網中的“開發 - 接口權限 - 網頁服務 - 網頁帳號 - 網頁授權獲取用戶基本信息”的配置選項中,修改授權

C#信公眾號開發接收事件推送與消息排重的方法

data push con 這樣的 etime ali 推薦 系列 是否 本文實例講述了C#微信公眾號開發之接收事件推送與消息排重的方法。分享給大家供大家參考。具體分析如下: 微信服務器在5秒內收不到響應會斷掉連接,並且重新發起請求,總共重試三次。這樣的話,問題就來了。有

信公眾號開發-回調的所有類型

mage 下回 nco ble sgi msg www 系統拍照 sel 眾所周知,微信公眾號配置後臺開發時,微信會在一些情況下回調我們配置的服務器地址,比如www.***.com/wechat_callback 盡管調用情況不同,調用的都是這一個接口,只是攜帶的參數不同,

從零開始搭建信硬件開發環境全過程——1小時掌握信硬件開發流程

sdn 流程 第三方服務 ota 必須 air 開發板 port pen 筆者決定在嵌入式企鵝圈2016年的首篇文章中,發表微信硬件物聯領域極具實踐價值的文章,它將