相關(guān)的lable和button位置綁定在一起解決方案

有個需求是這樣的矿微,有一個lable在一個button點擊后座慰,內(nèi)容發(fā)生改變仑氛,相關(guān)尺寸也要發(fā)生改變坝疼,想要那個點擊的buton位置跟隨lable的位置發(fā)生同步變化搜贤。
開始的思路是在button點擊執(zhí)行的方法中更新相關(guān)約束,位置更新的沒有達(dá)到想要的效果钝凶。就是lable的text屬性改變后仪芒,button的位置約束就更新了,而現(xiàn)在的lable的bounds還沒有變化,或者變化沒有完成掂名。這樣button相對的更新的位置就是沒有完全更新完的lable的位置為基準(zhǔn)据沈。所以沒有達(dá)到效果。
這個時候想著換用添加觀察者模式饺蔑,當(dāng)lable的bounds發(fā)生改變后锌介,button的相對約束再更新。由于lable是系統(tǒng)空間膀钠,不方便直接增加功能掏湾。我這邊選擇一個比較好實現(xiàn)的方式,從新創(chuàng)建一個類繼承自UILable肿嘲,在自定義lable初始化的方式中添加觀察者融击,觀察bounds屬性的變化,這時候效果達(dá)到了要求雳窟。下面是相關(guān)代碼實現(xiàn):

在實現(xiàn)上面的想法使用了block作為屬性尊浪,因為功能單一,使用delegate有點大材小用封救,也不方便拇涤。
*****  MyLable.h文件  *****
#import <UIKit/UIKit.h>

@interface MyLable : UILabel
//下面定義了block屬性,確定當(dāng)lable的bounds屬性發(fā)生改變后將要做什么操作
@property (nonatomic,copy) void (^change)();
@end

***** MyLable.m文件 *****
#import "MyLable.h"

@implementation MyLable

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
//稍微對標(biāo)簽做了下美化誉结,有圓角
    self.layer.cornerRadius = 5;
    self.layer.masksToBounds = YES;
//添加對bounds屬性的觀察
    [self addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew||NSKeyValueChangeOldKey context:nil];
}
//實現(xiàn)觀察者模式需要實現(xiàn)的方法鹅士,調(diào)用改變后定義的block屬性,做到改變后惩坑,
//完成需要的相關(guān)動作
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    self.change();
    NSLog(@"%@",change);

}
//注意在這個方法中移除觀察者掉盅,不然會發(fā)生錯誤。
-(void)dealloc{
    [self removeObserver:self forKeyPath:@"bounds"];
}

@end

下面是viewController.m
方法
//中間約束使用了Masonry第三方庫以舒,比較方便趾痘。可以使用cocopods導(dǎo)入到項目中使用蔓钟。
#import "ViewController.h"
#import <Masonry/Masonry.h>
#import "MyLable.h"
@interface ViewController ()
//因為需要在更新位置永票,使用到控件,便放到屬性滥沫,方便使用
@property (nonatomic,strong)MyLable* lb;
@property (nonatomic,strong)UIButton* bt;
//這個是為了點擊后侣集,有不同的效果,設(shè)置的一個變量
@property (nonatomic) BOOL ag;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.ag = YES;
    MyLable* lable = [[MyLable alloc]init];
    lable.lineBreakMode = NSLineBreakByWordWrapping;
    lable.numberOfLines = 0;
    lable.text = @"這世界很復(fù)雜,混淆我想說的話我不懂,太復(fù)雜的玩法兰绣,什么樣的禮物肚吏,能夠永遠(yuǎn)記得住讓幸福別走的太倉促,云和天,蝶和花狭魂,從來不需要說話,斷不了依然日夜?fàn)繏斐楦?說情話,只想讓你聽清楚雌澄,我愛你是唯一的傾訴";   
    lable.font = [UIFont systemFontOfSize:18];
    lable.textColor = [UIColor redColor];
    lable.backgroundColor = [UIColor grayColor];
    self.lb = lable;
    float scw = [[UIScreen mainScreen]bounds].size.width;
    [self.view addSubview:lable];
    [self.lb mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(40);
        make.width.mas_equalTo(scw-scw/4);
        make.centerX.mas_equalTo(0);
    }];
//用這個方法實現(xiàn)button的添加斋泄,可以達(dá)到在lable完成之后,button的相對位置才能正確镐牺。
    [self performSelectorOnMainThread:@selector(addButton) withObject:nil waitUntilDone:NO];
    
}
-(void)addButton{
    UIButton* button =[UIButton buttonWithType:UIButtonTypeSystem];
    [button setTitle:@"點擊" forState:UIControlStateNormal];
//為button添加點擊響應(yīng)方法炫掐,在響應(yīng)方法中確定約束更新。
    [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
    button.backgroundColor = [UIColor grayColor];
    self.bt = button;
    self.bt.titleLabel.textColor = [UIColor blackColor];
//避免循環(huán)引用的問題睬涧,為我自定義的MyLable對象的block屬性實現(xiàn)方法募胃。
    __block typeof(self) weakself = self;
    self.lb.change = ^(){
        [weakself.bt mas_updateConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(self.lb.bounds.size.height+50);
            make.centerX.mas_equalTo(0);
        }];
        
    };
    self.bt.layer.cornerRadius = 10;
    self.bt.layer.masksToBounds = YES;
    [self.view addSubview:button];
    [button mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.lb.bounds.size.height+50);
        make.width.mas_equalTo(100);
        make.centerX.mas_equalTo(0);
    }];
}
-(void)click{
    self.ag = !self.ag;
    if (self.ag) {
        self.lb.text = @"我是第二個內(nèi)容,我已經(jīng)變化了";
    }else{
    self.lb.text = @"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢uuuuuuuuuuuuuuuuuuuuuuuuuuuu";
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end



好了畦浓,到這里痹束,這個需求已經(jīng)能滿足了。其他更好的辦法還沒有想到讶请,想到了再更新祷嘶,如果有哪個高手有更好的方式,可以給我留言夺溢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末论巍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子风响,更是在濱河造成了極大的恐慌嘉汰,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件状勤,死亡現(xiàn)場離奇詭異鞋怀,居然都是意外死亡,警方通過查閱死者的電腦和手機荧降,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門接箫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朵诫,你說我怎么就攤上這事辛友。” “怎么了剪返?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵废累,是天一觀的道長。 經(jīng)常有香客問我脱盲,道長邑滨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任钱反,我火速辦了婚禮掖看,結(jié)果婚禮上匣距,老公的妹妹穿的比我還像新娘。我一直安慰自己哎壳,他們只是感情好毅待,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著归榕,像睡著了一般尸红。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刹泄,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天外里,我揣著相機與錄音,去河邊找鬼特石。 笑死盅蝗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的县匠。 我是一名探鬼主播风科,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乞旦!你這毒婦竟也來了贼穆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤兰粉,失蹤者是張志新(化名)和其女友劉穎故痊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玖姑,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡愕秫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了焰络。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戴甩。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖闪彼,靈堂內(nèi)的尸體忽然破棺而出甜孤,到底是詐尸還是另有隱情,我是刑警寧澤畏腕,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布缴川,位于F島的核電站,受9級特大地震影響描馅,放射性物質(zhì)發(fā)生泄漏把夸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一铭污、第九天 我趴在偏房一處隱蔽的房頂上張望恋日。 院中可真熱鬧膀篮,春花似錦、人聲如沸谚鄙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闷营。三九已至,卻和暖如春知市,著一層夾襖步出監(jiān)牢的瞬間傻盟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工嫂丙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娘赴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓跟啤,卻偏偏與公主長得像诽表,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子隅肥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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

  • 2017.02.22 可以練習(xí)竿奏,每當(dāng)這個時候,腦袋就犯困腥放,我這腦袋真是神奇呀泛啸,一說讓你做事情,你就犯困秃症,你可不要太...
    Carden閱讀 1,331評論 0 1
  • 開始iOS 7中自動布局教程(一) 發(fā)布于:2013-12-03 13:53閱讀數(shù):86977 到目前為止候址,如果你...
    誰的青春不迷茫閱讀 918評論 0 2
  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內(nèi)容...
    i得深刻方得S閱讀 4,640評論 1 9
  • 2017年10月24日 星期二 北京 晴 這段時間因事帶兒子來了幾趟北京,不知不覺中兒...
    最愛讀書人閱讀 225評論 0 0
  • 一提起上海种柑,好像無法和江南聯(lián)系起來岗仑。江南的意象,常常是一江朦朧聚请,兩岸相思荠雕。而每次去上海,印象都是陰冷陰冷的良漱,濕噠噠...
    王地閱讀 359評論 0 0