13-UI進(jìn)階(事件處理)

控制器的切換方式——Modal

  • 任何控制器都能通過(guò)Modal的形式展示出來(lái)
  • Modal的默認(rèn)效果:新控制器從屏幕的最底部往上鉆,直到蓋住之前的控制器為止

iOS開(kāi)發(fā)中的觸摸事件

  • 默認(rèn)的UIView是不能進(jìn)行多指觸控操作的,需要修改UIView的屬性才可以
  • iOS開(kāi)發(fā)中應(yīng)避免使用雙擊事件

重寫(xiě)hitTest方法

  • 默認(rèn)子控件不在父控件上是不能進(jìn)行點(diǎn)擊的,所以需要重寫(xiě)hitTest方法實(shí)現(xiàn)點(diǎn)擊效果

事件傳遞

  • touchesBegan的默認(rèn)做法是把事件傳遞給上一個(gè)響應(yīng)者(默認(rèn)是父控件),當(dāng)上一個(gè)響應(yīng)者為控制器時(shí),應(yīng)交由控制器處理

手勢(shì)識(shí)別器——UIGestureRecognizer

  • 手勢(shì)識(shí)別的代理方法,要遵守UIGestureRecognizerDelegate協(xié)議
// 是否允許開(kāi)始觸發(fā)手勢(shì)
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    return NO;
}

// 是否允許同時(shí)支持多個(gè)手勢(shì),默認(rèn)是不支持多個(gè)手勢(shì)
// 返回yes表示支持多個(gè)手勢(shì)
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

// 是否允許接收手指的觸摸點(diǎn)
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    // 獲取當(dāng)前的觸摸點(diǎn)
    CGPoint curP = [touch locationInView:self.imageView];
    
    if (curP.x < self.imageView.bounds.size.width * 0.5) {
        return NO;
    }else{
        return YES;
    }
}

自動(dòng)提示宏

  • 宏的操作原理,每輸入一個(gè)字母就會(huì)直接把宏右邊的拷貝,并且會(huì)自動(dòng)補(bǔ)齊前面的內(nèi)容
// 宏里面的#,會(huì)自動(dòng)把后面的參數(shù)變成C語(yǔ)言的字符串
#define keyPath(objc,keyPath) @(((void)objc.keyPath,#keyPath))

NSLog(@"%@",[keyPath(_mainV, frame) class]);

抽屜效果

  • 利用KVO時(shí)刻監(jiān)聽(tīng)mainV的frame屬性的改變
    // 利用KVO時(shí)刻監(jiān)聽(tīng)mainV的frame屬性
    // Observer:觀察者 誰(shuí)想監(jiān)聽(tīng)
    // KeyPath:監(jiān)聽(tīng)的屬性
    // options:監(jiān)聽(tīng)新值的改變
    [_mainV addObserver:self forKeyPath:keyPath(_mainV, frame) options:NSKeyValueObservingOptionNew context:nil];

// 只要監(jiān)聽(tīng)的屬性一改變,就會(huì)調(diào)用觀察者的這個(gè)方法,通知你有新值
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"%@",NSStringFromCGRect(_mainV.frame));
    if (_mainV.frame.origin.x > 0) { // 往右邊移動(dòng),隱藏藍(lán)色的view
        _rightV.hidden = YES;
    }else if (_mainV.frame.origin.x < 0){ // 往左邊移動(dòng),顯示藍(lán)色的view
        _rightV.hidden = NO;
    }
}

// 在對(duì)象銷毀的時(shí)候,一定要注意移除觀察者
- (void)dealloc
{
    // 移除觀察者
    [_mainV removeObserver:self forKeyPath:@"frame"];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容