Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Ïê½â iOS ×Ô¶¯²¼¾Ö¿ò¼Ü Masonry
 
×÷ÕߣºÁõС׳ À´Ô´£º¼«¿ÍÍ·Ìõ ·¢²¼ÓÚ£º2017-1-17
  3075  次浏览      27
 

ǰÑÔ

Ŀǰ iOS ¿ª·¢Öдó¶àÊýÒ³Ãæ¶¼ÒѾ­¿ªÊ¼Ê¹Óà Interface Builder µÄ·½Ê½½øÐÐ UI ¿ª·¢ÁË£¬µ«ÊÇÔÚһЩ±ä»¯±È½Ï¸´ÔÓµÄÒ³Ãæ£¬»¹ÊÇÐèҪͨ¹ý´úÂëÀ´½øÐÐ UI ¿ª·¢µÄ¡£¶øÇÒÓкܶà±È½ÏÀϵÄÏîÄ¿£¬±¾Éí¾Í»¹ÔÚ²ÉÓô¿´úÂëµÄ·½Ê½½øÐпª·¢¡£

¶øÏÖÔÚ iPhone ºÍ iPad ÆÁÄ»³ß´çÔ½À´Ô½¶à£¬ËäÈ»¿ª·¢ÕßÖ»ÐèÒª¸ù¾ÝÆÁÄ»µã½øÐпª·¢£¬¶ø²»ÐèÒª»ùÓÚÏñËØµã½øÐÐ UI ¿ª·¢¡£µ«Èç¹ûÔÚÏîÄ¿Öиù¾Ý²»Í¬ÆÁÄ»³ß´ç½øÐи÷ÖÖÅжϣ¬Ð´ËÀ×ø±êµÄ»°£¬ÕâÑù¿ª·¢ÆðÀ´ÊǺܳÔÁ¦µÄ¡£

ËùÒÔÒ»°ãÓô¿´úÂ뿪·¢ UI µÄ»°£¬Ò»°ã¶¼ÊÇÅäºÏһЩ×Ô¶¯»¯²¼¾ÖµÄ¿ò¼Ü½øÐÐÆÁÄ»ÊÊÅ䡣ƻ¹ûΪÎÒÃÇÌṩµÄÊÊÅä¿ò¼ÜÓУºVFL¡¢UIViewAutoresizing¡¢Auto Layout¡¢Size Classes µÈ¡£

ÆäÖÐ Auto Layout ÊÇʹÓÃÆµÂÊ×î¸ßµÄ²¼¾Ö¿ò¼Ü£¬µ«ÊÇÆäÒ²Óб׶ˡ£¾ÍÊÇÔÚʹÓà UILayoutConstraint µÄʱºò£¬»á·¢ÏÖ´úÂëÁ¿ºÜ¶à£¬¶øÇÒ´ó¶à¶¼ÊÇÖØ¸´ÐԵĴúÂ룬ÒÔÖÁÓںöàÈ˶¼²»ÏëÓÃÕâ¸ö¿ò¼Ü¡£

ºóÀ´ Github ÉϵijöÏÖÁË»ùÓÚ UILayoutConstraint ·â×°µÄµÚÈý·½²¼¾Ö¿ò¼Ü Masonry£¬ÆäʹÓÃÆðÀ´·Ç³£·½±ã£¬±¾ÆªÎÄÕ¾ÍÀ´Ïêϸ½²Ò»Ï Masonry µÄʹÓá£

Masonry ½éÉÜ

ÕâÆªÎÄÕÂÖ»ÊǼòµ¥½éÉÜMasonry£¬ÒÔ¼°MasonryµÄʹÓ㬲¢ÇÒ»á¾ÙһЩÀý×Ó³öÀ´¡£µ«²¢²»»áÉæ¼°µ½MasonryµÄÄÚ²¿ÊµÏÖ£¬ÒÔºó»áרÃÅдƪÎÄÕÂÀ´½éÉÜÆäÄÚ²¿ÊµÏÖÔ­Àí£¬°üÀ¨Ë³±ã½²Ò»ÏÂÁ´Ê½Óï·¨¡£

ʲôÊÇ Masonry

MasonryÊÇÒ»¸ö¶ÔϵͳNSLayoutConstraint½øÐзâ×°µÄµÚÈý·½×Ô¶¯²¼¾Ö¿ò¼Ü£¬²ÉÓÃÁ´Ê½±à³ÌµÄ·½Ê½Ìṩ¸ø¿ª·¢Õß API¡£ÏµÍ³AutoLayoutÖ§³ÖµÄ²Ù×÷£¬Masonry¶¼Ö§³Ö£¬Ïà±ÈϵͳAPI¹¦ÄÜÀ´Ëµ£¬MasonryÊÇÓйýÖ®¶øÎÞ²»¼°¡£

Masonry²ÉÈ¡ÁËÁ´Ê½±à³ÌµÄ·½Ê½£¬´úÂëÀí½âÆðÀ´·Ç³£ÇåÎúÒ×¶®£¬¶øÇÒдÍêÖ®ºó´úÂëÁ¿¿´ÆðÀ´·Ç³£ÉÙ¡£Ö®Ç°ÓÃNSLayoutConstraintдºÜ¶à´úÂë²ÅÄÜʵÏֵIJ¼¾Ö£¬ÓÃMasonry×îÉÙÒ»ÐдúÂë¾Í¿ÉÒԸ㶨¡£ÏÂÃæ¿´µ½MasonryµÄ´úÂë¾Í»á·¢ÏÖ£¬Ì«¼òµ¥Ò×¶®ÁË¡£

MasonryÊÇͬʱ֧³Ö macOS ºÍ iOS Á½¸öƽ̨µÄ£¬ÔÚÕâÁ½¸öƽ̨É϶¼¿ÉÒÔʹÓÃMasonry½øÐÐ×Ô¶¯²¼¾Ö¡£ÎÒÃÇ¿ÉÒÔ´ÓMASUtilities.hÎļþÖУ¬¿´µ½ÏÂÃæµÄ¶¨Ò壬Õâ¾ÍÊÇMasonryͨ¹ýºê¶¨ÒåµÄ·½Ê½£¬Çø·ÖÁ½¸öƽ̨¶ÀÓеÄһЩ¹Ø¼ü×Ö¡£

#if TARGET_OS_IPHONE    
#import <UIKit/UIKit.h>
#define MAS_VIEW UIView
#define MASEdgeInsets UIEdgeInsets
#elif TARGET_OS_MAC
#import <AppKit/AppKit.h>
#define MAS_VIEW NSView
#define MASEdgeInsets NSEdgeInsets
#endif

 

Github µØÖ·£ºhttps://github.com/SnapKit/Masonry

¼¯³É·½Ê½

MasonryÖ§³ÖCocoaPods£¬¿ÉÒÔÖ±½Óͨ¹ýpodfileÎļþ½øÐм¯³É£¬ÐèÒªÔÚCocoaPodsÖÐÌí¼ÓÏÂÃæ´úÂ룺

pod 'Masonry'

Masonry ѧϰ½¨Òé

ÔÚ UI ¿ª·¢ÖУ¬´¿´úÂëºÍInterface BuilderÎÒ¶¼ÊÇÓùýµÄ£¬ÔÚ¿ª·¢¹ý³ÌÖÐÒ²»ýÀÛÁËһЩ¾­Ñé¡£¶ÔÓÚ³õѧÕßѧϰ´¿´úÂëAutoLayout£¬ÎÒ½¨Ò黹ÊÇÏÈѧ»áInterface Builder·½Ê½µÄAutoLayout£¬ÁìÎòÆ»¹û¶Ô×Ô¶¯²¼¾ÖµÄ¹æÔòºÍ˼Ï룬ȻºóÔÙ°ÑÕâÌ×˼ÏëǶÌ×ÔÚ´¿´úÂëÉÏ¡£ÕâÑùѧϰÆðÀ´¸üºÃÈëÊÖ£¬Ò²¿ÉÒÔ±ÜÃâ²ÈºÃ¶à¿Ó¡£

ÔÚÏîÄ¿ÖÐÉèÖõÄAutoLayoutÔ¼Êø£¬Æðµ½¶ÔÊÓͼ²¼¾ÖµÄ±ê¼Ç×÷Óá£ÉèÖúÃÔ¼ÊøÖ®ºó£¬³ÌÐòÔËÐйý³ÌÖд´½¨ÊÓͼʱ£¬»á¸ù¾ÝÉèÖúõÄÔ¼Êø¼ÆËãframe£¬²¢äÖȾµ½ÊÓͼÉÏ¡£

ËùÒÔÔÚ´¿´úÂëÇé¿öÏ£¬ÊÓͼÉèÖõÄÔ¼ÊøÊÇ·ñÕýÈ·£¬ÒªÒÔÔËÐÐÖ®ºóÏÔʾµÄ½á¹ûºÍ´òÓ¡µÄlogΪ׼¡£

Masonry ÖеĿÓ

ÔÚʹÓÃMasonry½øÐÐÔ¼ÊøÊ±£¬ÓÐһЩÊÇÐèҪעÒâµÄ¡£

ÔÚʹÓÃMasonryÌí¼ÓÔ¼ÊøÖ®Ç°£¬ÐèÒªÔÚaddSubviewÖ®ºó²ÅÄÜʹÓ㬷ñÔò»áµ¼Ö±ÀÀ£¡£

ÔÚÌí¼ÓÔ¼ÊøÊ±³õѧÕß¾­³£»á³öÏÖһЩ´íÎó£¬Ô¼Êø³öÏÖÎÊÌâµÄÔ­ÒòÒ»°ã¾ÍÊÇÁ½ÖÖ£ºÔ¼Êø³åÍ»ºÍȱÉÙÔ¼Êø¡£¶ÔÓÚÕâÁ½ÖÖÎÊÌ⣬¿ÉÒÔͨ¹ýµ÷ÊÔºÍlogÅŲ顣

֮ǰʹÓÃInterface BuilderÌí¼ÓÔ¼Êø£¬Èç¹ûÔ¼ÊøÓдíÎóÖ±½Ó¾Í¿ÉÒÔ¿´³öÀ´£¬²¢ÇÒ»áÒÔºìÉ«»òÕß»ÆÉ«¾¯¸æÌåÏÖ³öÀ´¡£¶øMasonryÔò²»»áÖ±¹ÛµÄÌåÏÖ³öÀ´£¬¶øÊÇÒÔÔËÐйý³ÌÖбÀÀ£»òÕß´òÓ¡Òì³£logÌåÏÖ£¬ËùÒÔÕâÒ²ÊÇÊÖд´úÂë½øÐÐAutoLayoutµÄÒ»¸öȱµã¡£

Õâ¸öÎÊÌâÖ»ÄÜͨ¹ý¶àÇôúÂ룬»ýÔÜ´¿´úÂë½øÐÐAutoLayoutµÄ¾­Ñ飬ÂýÂý¾ÍÓÃÆðÀ´Ô½À´Ô½µÃÐÄÓ¦ÊÖÁË¡£

Masonry »ù´¡Ê¹ÓÃ

Masonry »ù´¡ API

mas_makeConstraints()    Ìí¼ÓÔ¼Êø
mas_remakeConstraints() ÒÆ³ý֮ǰµÄÔ¼Êø£¬ÖØÐÂÌí¼ÓеÄÔ¼Êø
mas_updateConstraints() ¸üÐÂÔ¼Êø

equalTo() ²ÎÊýÊǶÔÏóÀàÐÍ£¬Ò»°ãÊÇÊÓͼ¶ÔÏó»òÕß mas_width ÕâÑùµÄ×ø±êϵ¶ÔÏó
mas_equalTo() ºÍÉÏÃæ¹¦ÄÜÏàͬ£¬²ÎÊý¿ÉÒÔ´«µÝ»ù´¡Êý¾ÝÀàÐͶÔÏ󣬿ÉÒÔÀí½âΪ±ÈÉÏÃæµÄ API ¸üÇ¿´ó

width() ÓÃÀ´±íʾ¿í¶È£¬ÀýÈç´ú±í view µÄ¿í¶È

Auto Boxing

ÉÏÃæÀýÈçequalTo»òÕßwidthÕâÑùµÄ£¬ÓÐʱºòÐè񻃾¼°µ½Ê¹ÓÃmas_ǰ׺£¬ÕâÔÚ¿ª·¢ÖÐÐèҪעÒâ×÷Çø·Ö¡£

Èç¹ûÔÚµ±Ç°ÀàÒýÈë#import "Masonry.h"֮ǰ£¬ÓÃÏÂÃæÁ½Öֺ궨ÒåÉùÃ÷һϣ¬¾Í²»Ðè񻂿·Ömas_ǰ׺¡£

// ¶¨ÒåÕâ¸ö³£Á¿£¬¾Í¿ÉÒÔ²»ÓÃÔÚ¿ª·¢¹ý³ÌÖÐʹÓÃ"mas_"ǰ׺¡£
#define MAS_SHORTHAND
// ¶¨ÒåÕâ¸ö³£Á¿£¬¾Í¿ÉÒÔÈà Masonry °ïÎÒÃÇ×Ô¶¯°Ñ»ù´¡Êý¾ÝÀàÐ͵ÄÊý¾Ý£¬×Ô¶¯×°ÏäΪ¶ÔÏóÀàÐÍ¡£
#define MAS_SHORTHAND_GLOBALS

ÐÞÊÎÓï¾ä

MasonryΪÁËÈôúÂëʹÓúÍÔĶÁ¸üÈÝÒ×Àí½â£¬ËùÒÔÖ±½Óͨ¹ýµãÓï·¨¾Í¿ÉÒÔµ÷Ó㬻¹Ìí¼ÓÁËandºÍwithÁ½¸ö·½·¨¡£ÕâÁ½¸ö·½·¨ÄÚ²¿Êµ¼ÊÉÏʲô¶¼Ã»¸É£¬Ö»ÊÇÔÚÄÚ²¿½«selfÖ±½Ó·µ»Ø£¬¹¦ÄܾÍÊÇΪÁ˸ü¼Ó·½±ãÔĶÁ£¬¶Ô´úÂëÖ´ÐÐûÓÐʵ¼Ê×÷Óá£

ÀýÈçÏÂÃæµÄÀý×Ó£º

make.top.and.bottom.equalTo(self.containerView).with.offset(padding);

ÆäÄÚ²¿´úÂëʵÏÖ£¬Êµ¼ÊÉϾÍÊÇÖ±½Ó½«self·µ»Ø¡£

- (MASConstraint *)with {
return self;
}

¸üÐÂÔ¼ÊøºÍ²¼¾Ö

¹ØÓÚ¸üÐÂÔ¼Êø²¼¾ÖÏà¹ØµÄ API£¬Ö÷ÒªÓÃÒÔÏÂËĸö£º

- (void)updateConstraintsIfNeeded  µ÷Óô˷½·¨£¬
Èç¹ûÓбê¼ÇΪÐèÒªÖØÐ²¼¾ÖµÄÔ¼Êø£¬ÔòÁ¢¼´½øÐÐÖØÐ²¼¾Ö£¬
ÄÚ²¿»áµ÷Óà updateConstraints ·½·¨
- (void)updateConstraints ÖØÐ´´Ë·½·¨£¬
ÄÚ²¿ÊµÏÖ×Ô¶¨Òå²¼¾Ö¹ý³Ì
- (BOOL)needsUpdateConstraints µ±Ç°ÊÇ·ñÐèÒªÖØÐ²¼¾Ö£¬
ÄÚ²¿»áÅжϵ±Ç°ÓÐûÓб»±ê¼ÇµÄÔ¼Êø
- (void)setNeedsUpdateConstraints ±ê¼ÇÐèÒª½øÐÐÖØÐ²¼¾Ö

¹ØÓÚUIViewÖØÐ²¼¾ÖÏà¹ØµÄ API£¬Ö÷ÒªÓÃÒÔÏÂÈý¸ö£º

- (void)setNeedsLayout  ±ê¼ÇΪÐèÒªÖØÐ²¼¾Ö
- (void)layoutIfNeeded ²é¿´µ±Ç°ÊÓͼÊÇ·ñ±»±ê¼ÇÐèÒªÖØÐ²¼¾Ö£¬
ÓÐÔòÔÚÄÚ²¿µ÷Óà layoutSubviews ·½·¨½øÐÐÖØÐ²¼¾Ö
- (void)layoutSubviews ÖØÐ´µ±Ç°·½·¨£¬ÔÚÄÚ²¿Íê³ÉÖØÐ²¼¾Ö²Ù×÷

Masonry ʾÀý´úÂë

Masonry ±¾ÖÊÉϾÍÊǶÔϵͳ AutoLayout ½øÐеķâ×°£¬°üÀ¨ÀïÃæºÜ¶àµÄ API£¬¶¼ÊǶÔϵͳ API ½øÐÐÁËÒ»´Î¶þ´Î°ü×°¡£

typedef NS_OPTIONS(NSInteger, MASAttribute) {
MASAttributeLeft = 1 << NSLayoutAttributeLeft,
MASAttributeRight = 1 << NSLayoutAttributeRight,
MASAttributeTop = 1 << NSLayoutAttributeTop,
MASAttributeBottom = 1 << NSLayoutAttributeBottom,
MASAttributeLeading = 1 << NSLayoutAttributeLeading,
MASAttributeTrailing = 1 << NSLayoutAttributeTrailing,
MASAttributeWidth = 1 << NSLayoutAttributeWidth,
MASAttributeHeight = 1 << NSLayoutAttributeHeight,
MASAttributeCenterX = 1 << NSLayoutAttributeCenterX,
MASAttributeCenterY = 1 << NSLayoutAttributeCenterY,
MASAttributeBaseline = 1 << NSLayoutAttributeBaseline,
};

³£Ó÷½·¨

ÉèÖÃÄڱ߾à

/** 
ÉèÖà yellow ÊÓͼºÍ self.view µÈ´ó£¬²¢ÇÒÓÐ 10 µÄÄڱ߾ࡣ
×¢Òâ¸ù¾Ý UIView µÄ×ø±êϵ£¬ÏÂÃæ right ºÍ bottom ½øÐÐÁË
È¡·´¡£ËùÒÔ²»ÄÜд³ÉÏÂÃæÕâÑù£¬·ñÔò right¡¢bottom ÕâÁ½¸ö
·½Ïò»á³öÏÖÎÊÌâ¡£
make.edges.equalTo(self.view).with.offset(10);

³ýÁËÏÂÃæÀý×ÓÖÐµÄ offset()·½·¨£¬»¹ÓÐÕë¶Ô²»Í¬×ø±êϵµÄ
centerOffset()¡¢sizeOffset()¡¢valueOffset()Ö®ÀàµÄ·½·¨¡£
*/
[self.yellowView mas_makeConstraints:^(MASConstraintMaker
*make) {
make.left.equalTo(self.view).with.offset(10);
make.top.equalTo(self.view).with.offset(10);
make.right.equalTo(self.view).with.offset(-10);
make.bottom.equalTo(self.view).with.offset(-10);
}];

ͨ¹ý insets ¼ò»¯ÉèÖÃÄڱ߾àµÄ·½Ê½

//ÏÂÃæµÄ·½·¨ºÍÉÏÃæÀý×ӵȼۣ¬Çø±ðÔÚÓÚʹÓà insets()·½·¨¡£
[self.blueView mas_makeConstraints:^(MASConstraintMaker *make) {
// Ï¡¢ÓÒ²»ÐèҪд¸ººÅ£¬insets ·½·¨ÖÐÒѾ­ÎªÎÒÃÇ×öÁËÈ¡·´µÄ²Ù×÷ÁË¡£
make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];

¸üÐÂÔ¼Êø£º

// ÉèÖà greenView µÄ center ºÍ size£¬ÕâÑù¾Í¿ÉÒÔ´ïµ½¼òµ¥½øÐÐÔ¼ÊøµÄÄ¿µÄ
[self.greenView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
// ÕâÀïͨ¹ý mas_equalTo ¸ø size ÉèÖÃÁË»ù´¡Êý¾ÝÀàÐ͵IJÎÊý£¬²ÎÊýΪ
CGSize µÄ½á¹¹Ìå
make.size.mas_equalTo(CGSizeMake(300, 300));
}];

// ΪÁ˸üÇå³þµÄ¿´³öÔ¼Êø±ä»¯µÄЧ¹û£¬ÔÚÏÔʾÁ½Ãëºó¸üÐÂÔ¼Êø¡£
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)
(2.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.greenView mas_updateConstraints:^(MASConstraintMaker *make)
{
make.centerX.equalTo(self.view).offset(100);
make.size.mas_equalTo(CGSizeMake(100, 100));
}];
});

´óÓÚµÈÓÚºÍСÓÚµÈÓÚij¸öÖµµÄÔ¼Êø£º

[self.textLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
// ÉèÖÿí¶ÈСÓÚµÈÓÚ 200
make.width.lessThanOrEqualTo(@200);
// ÉèÖø߶ȴóÓÚµÈÓÚ 10
make.height.greaterThanOrEqualTo(@(10));
}];

self.textLabel.text = @"ÕâÊDzâÊÔµÄ×Ö·û´®¡£ÄÜ¿´µ½ 1¡¢2¡¢3 ¸ö²½Ö裬
µÚÒ»²½µ±È»ÊÇÉÏ´«ÕÕÆ¬ÁË£¬ÒªÉÏ´«ÕýÃæ½üÕÕŶ¡£ÉÏ´«ºó£¬ÍøÕ¾»á×Ô¶¯Ê¶±ð
ÄãµÄÃæ²¿£¬Èç¹û¾õµÃʶ±ðµÄ²»×¼£¬Ä㻹¿ÉÒÔÊÖ¶¯ÐÞ¸Äһϡ£×ó±ß¿ÉÒÔ¿´µ½
16 ÏîÐ޸IJÎÊý£¬×îÉÏÃæÊÇÕûÌåÐ޸ģ¬ÄãÒ²¿ÉÒÔ¸ù¾Ý×Ô¼ºµÄÒâÔ¸µ¥¶ÀÐÞ¸Ä
ijÏ½«Êó±ê·Åµ½Ñ¡ÏîÉÏÃæ£¬ÓұߵÄÔ¤ÀÀͼ»áÏÔʾÏàÓ¦µÄλÖá£";

self.textLabel.numberOfLines = 0;

/** 
Èç¹ûÏëʹÓûù´¡Êý¾ÝÀàÐ͵±×ö²ÎÊý£¬Masonry ΪÎÒÃÇÌṩÁË"mas_xx"¸ñʽµÄºê¶¨Òå¡£
ÕâЩºê¶¨Òå»á½«´«ÈëµÄ»ù´¡Êý¾ÝÀàÐÍת»»Îª NSNumber ÀàÐÍ£¬Õâ¸ö¹ý³Ì½Ð×ö·âÏä(Auto Boxing)¡£

"mas_xx"¿ªÍ·µÄºê¶¨Ò壬ÄÚ²¿¶¼ÊÇͨ¹ý MASBoxValue()º¯ÊýʵÏֵġ£
ÕâÑùµÄºê¶¨ÒåÖ÷ÒªÓÐËĸö£¬·Ö±ðÊÇ mas_equalTo()¡¢mas_offset()ºÍ´óÓÚµÈÓÚ¡¢Ð¡ÓÚµÈÓÚËĸö¡£
*/
[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.width.mas_equalTo(100);
make.height.mas_equalTo(100);
}];

ʹÓûù´¡Êý¾ÝÀàÐ͵±×ö²ÎÊý£º

[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.width.equalTo(self.view).priorityLow();
make.width.mas_equalTo(20).priorityHigh();
make.height.equalTo(self.view).priority(200);
make.height.mas_equalTo(100).priority(1000);
}];

ÉèÖÃÔ¼ÊøÓÅÏȼ¶£º

Masonry ΪÎÒÃÇÌṩÁËÈý¸öĬÈϵķ½·¨£¬priorityLow()¡¢priorityMedium()¡¢priorityHigh()£¬ÕâÈý¸ö·½·¨ÄÚ²¿¶ÔÓ¦×Ų»Í¬µÄĬÈÏÓÅÏȼ¶¡£³ýÁËÕâÈý¸ö·½·¨£¬ÎÒÃÇÒ²¿ÉÒÔ×Ô¼ºÉèÖÃÓÅÏȼ¶µÄÖµ£¬¿ÉÒÔͨ¹ý priority()·½·¨À´ÉèÖá£

[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.width.equalTo(self.view).priorityLow();
make.width.mas_equalTo(20).priorityHigh();
make.height.equalTo(self.view).priority(200);
make.height.mas_equalTo(100).priority(1000);
}];

Masonry Ò²°ïÎÒÃǶ¨ÒåºÃÁËһЩĬÈϵÄÓÅÏȼ¶³£Á¿£¬·Ö±ð¶ÔÓ¦×Ų»Í¬µÄÊýÖµ£¬ÓÅÏȼ¶×î´óÊýÖµÊÇ 1000¡£

static const MASLayoutPriority MASLayoutPriorityRequired = 
UILayoutPriorityRequired;
static const MASLayoutPriority MASLayoutPriorityDefaultHigh =
UILayoutPriorityDefaultHigh;
static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 500;
static const MASLayoutPriority MASLayoutPriorityDefaultLow =
UILayoutPriorityDefaultLow;
static const MASLayoutPriority MASLayoutPriorityFittingSizeLevel =
UILayoutPriorityFittingSizeLevel;

ÉèÖÃÔ¼Êø±ÈÀý£º

// ÉèÖõ±Ç°Ô¼ÊøÖµ³ËÒÔ¶àÉÙ£¬ÀýÈçÕâ¸öÀý×ÓÊÇ redView µÄ¿í¶ÈÊÇ self.view ¿í¶ÈµÄ 0.2 ±¶¡£
[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.height.mas_equalTo(30);
make.width.equalTo(self.view).multipliedBy(0.2);
}];

СÁ·Ï°

×ÓÊÓͼµÈ¸ßÁ·Ï°£º

/** 
ÏÂÃæµÄÀý×ÓÊÇͨ¹ý¸ø equalTo()·½·¨´«ÈëÒ»¸öÊý×飬ÉèÖÃÊý×éÖÐ×ÓÊÓͼ¼°µ±Ç°
make ¶ÔÓ¦µÄÊÓͼ֮¼äµÈ¸ß¡£

ÐèҪעÒâµÄÊÇ£¬ÏÂÃæ block ÖÐÉèÖñ߾àµÄʱºò£¬Ó¦¸ÃÓà insets À´ÉèÖã¬
¶ø²»ÊÇÓà offset¡£
ÒòΪÓà offset ÉèÖà right ºÍ bottom µÄ±ß¾àʱ£¬ÕâÁ½¸öÖµÓ¦¸ÃÊǸºÊý£¬
ËùÒÔÈç¹ûͨ¹ý offset À´Í³Ò»ÉèÖÃÖµ»áÓÐÎÊÌâ¡£
*/
CGFloat padding = LXZViewPadding;
[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.top.equalTo(self.view).insets(UIEdgeInsetsMake
(padding, padding, 0, padding));
make.bottom.equalTo(self.blueView.mas_top).offset(-padding);
}];

[self.blueView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.view).insets(UIEdgeInsetsMake
(0, padding, 0, padding));
make.bottom.equalTo(self.yellowView.mas_top).offset(-padding);
}];

/**
ÏÂÃæÉèÖà make.height µÄÊý×éÊǹؼü£¬Í¨¹ýÕâ¸öÊý×é¿ÉÒÔÉèÖÃÕâÈý¸öÊÓͼ
¸ß¶ÈÏàµÈ¡£ÆäËûÀýÈç¿í¶ÈÖ®ÀàµÄ£¬Ò²ÊÇÀàËÆµÄ·½Ê½¡£
*/
[self.yellowView mas_makeConstraints:^(MASConstraintMaker *make)
{
make.left.right.bottom.equalTo(self.view).insets(UIEdgeInsetsMake
(0, padding, padding, padding));
make.height.equalTo(@[self.blueView, self.redView]);
}];

×ÓÊÓͼ´¹Ö±¾ÓÖÐÁ·Ï°£º

/** 
ÒªÇó£º(Õâ¸öÀý×ÓÊÇÔÚÆäËûÈ˲©¿ÍÀï¿´µ½µÄ£¬È»ºó°´ÕÕÒªÇó×Ô¼ºÐ´ÁËÏÂÃæÕâ¶Î´úÂë)
Á½¸öÊÓͼÏà¶ÔÓÚ¸¸ÊÓͼ´¹Ö±¾ÓÖУ¬²¢ÇÒÁ½¸öÊÓͼÒÔ¼°¸¸ÊÓͼ֮¼äµÄ±ß¾à¾ùΪ 10£¬¸ß¶ÈΪ 150£¬Á½¸öÊÓͼ¿í¶ÈÏàµÈ¡£
*/
CGFloat padding = 10.f;
[self.blueView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view);
make.left.equalTo(self.view).mas_offset(padding);
make.right.equalTo(self.redView.mas_left).mas_offset(-padding);
make.width.equalTo(self.redView);
make.height.mas_equalTo(150);
}];

[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view);
make.right.equalTo(self.view).mas_offset(-padding);
make.width.equalTo(self.blueView);
make.height.mas_equalTo(150);
}];

UITableView ¶¯Ì¬ Cell ¸ß¶È

ÔÚ iOS UI ¿ª·¢¹ý³ÌÖУ¬UITableViewµÄ¶¯Ì¬Cell¸ß¶ÈÒ»Ö±¶¼ÊǸöÎÊÌ⡣ʵÏÖÕâÑùµÄÐèÇó£¬ÊµÏÖ·½Ê½ÓкܶàÖÖ£¬Ö»ÊÇʵÏÖÆðÀ´¸´Ôӳ̶ȺÍÐÔÄܵÄÇø±ð¡£

ÔÚ²»¿¼ÂÇÐÔÄܵÄÇé¿öÏ£¬tableView¶¯Ì¬Cell¸ß¶È£¬¿ÉÒÔ²ÉÈ¡¹ÀËã¸ß¶ÈµÄ·½Ê½¡£Èç¹ûͨ¹ý¹ÀËã¸ß¶ÈµÄ·½Ê½ÊµÏֵϰ£¬ÎÞÂÛÊÇ´¿´úÂ뻹ÊÇInterface Builder£¬¶¼Ö»ÐèÒªÁ½ÐдúÂë¾Í¿ÉÒÔÍê³ÉCell×Ô¶¯¸ß¶ÈÊÊÅä¡£

ʵÏÖ·½Ê½£º

ÐèÒªÉèÖÃtableViewµÄrowHeightÊôÐÔ£¬ÕâÀïÉèÖÃΪ×Ô¶¯¸ß¶È£¬¸æËßϵͳCellµÄ¸ß¶ÈÊDz»¹Ì¶¨µÄ£¬ÐèҪϵͳ°ïÎÒÃǽøÐмÆË㡣ȻºóÉèÖÃtableViewµÄestimatedRowHeightÊôÐÔ£¬ÉèÖÃÒ»¸ö¹À¼ÆµÄ¸ß¶È¡£(ÎÒÕâÀïÓõĴúÀí·½·¨£¬Êµ¼ÊÉ϶¼Ò»Ñù)

Ô­Àí£º

ÕâÑùµÄ»°£¬ÔÚtableView±»´´½¨Ö®ºó£¬ÏµÍ³»á¸ù¾ÝestimatedRowHeightÊôÐÔÉèÖõÄÖµ£¬ÎªtableViewÉèÖÃÒ»¸ö¹À¼ÆµÄÖµ¡£È»ºóÔÚCellÏÔʾµÄʱºòÔÙ»ñÈ¡CellµÄ¸ß¶È£¬²¢Ë¢ÐÂtableViewµÄcontentSize¡£

- (void)tableViewConstraints {
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make)
{
make.edges.equalTo(self.view);
}];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:
(NSInteger)section {
return self.dataList.count;

}

- (MasonryTableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MasonryTableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:LXZTableViewCellIdentifier];
[cell reloadViewWithText:self.dataList[indexPath.row]];
return cell;
}

// ÐèҪעÒâµÄÊÇ£¬Õâ¸ö´úÀí·½·¨ºÍÖ±½Ó·µ»Øµ±Ç° Cell ¸ß¶ÈµÄ´úÀí·½·¨²¢²»Ò»Ñù¡£
// Õâ¸ö´úÀí·½·¨»á½«µ±Ç°ËùÓÐ Cell µÄ¸ß¶È¶¼Ô¤¹À³öÀ´£¬¶ø²»ÊÇÖ»¼ÆËãÏÔʾµÄ
Cell£¬ËùÒÔÕâÖÖ·½Ê½¶ÔÐÔÄÜÏûºÄ»¹ÊǺܴóµÄ¡£
// ËùÒÔͨ¹ýÉèÖà estimatedRowHeight ÊôÐԵķ½Ê½£¬ºÍÕâÖÖ´úÀí·½·¨µÄ·½Ê½£¬
×îºóÐÔÄÜÏûºÄ¶¼ÊÇÒ»ÑùµÄ¡£
- (CGFloat)tableView:(UITableView *)tableView
estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 50.f;
}

- (UITableView *)tableView {
if (!_tableView) {
_tableView = [[UITableView alloc] initWithFrame:
CGRectZero style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;
// ÉèÖà tableView ×Ô¶¯¸ß¶È
_tableView.rowHeight = UITableViewAutomaticDimension;
[_tableView registerClass:[MasonryTableViewCell class]
forCellReuseIdentifier:LXZTableViewCellIdentifier];
[self.view addSubview:_tableView];
}
return _tableView;
}

UIScrollView ×Ô¶¯²¼¾Ö

֮ǰÌýºÜ¶àÈË˵¹ýUIScrollViewºÜÂé·³£¬È»¶øÎÒ²¢Ã»Óиоõµ½ÓжàÂé·³(²¢·Ç×°±Æ)¡£ÎҸоõ˵Âé·³µÄÈË¿ÉÄܸù±¾¾ÍûÊÔ¹ý°É£¬Ö»ÊǾõµÃºÜÂé·³¶øÒÑ¡£

ÎÒÕâÀï¾Í½²Ò»ÏÂÁ½ÖÖ½øÐÐUIScrollView×Ô¶¯²¼¾ÖµÄ·½°¸£¬²¢ÇһὲһÏÂ×Ô¶¯²¼¾ÖµÄ¼¼ÇÉ£¬Ö»ÒªÕÆÎÕ¼¼ÇÉ£¬²¼¾ÖÆäʵºÜ¼òµ¥¡£

²¼¾ÖС¼¼ÇÉ£º 
¸øUIScrollViewÌí¼ÓµÄÔ¼ÊøÊǶ¨ÒåÆäframe£¬ÉèÖÃcontentSizeÊǶ¨ÒåÆäÄÚ²¿´óС¡£
UIScrollView½øÐÐaddSubview²Ù×÷£¬¶¼Êǽ«Æä×ÓÊÓͼÌí¼Óµ½contentViewÉÏ¡£
ËùÒÔ£¬Ìí¼Óµ½UIScrollViewÉϵÄ×ÓÊÓͼ£¬¶ÔUIScrollViewÌí¼ÓµÄÔ¼Êø¶¼ÊÇ×÷ÓÃÓÚ
contentViewÉϵġ£Ö»ÐèÒª°´ÕÕÕâÑùµÄ˼·¸øUIScrollViewÉèÖÃÔ¼Êø£¬¾Í¿ÉÒÔÕÆÎÕ
ÉèÖÃÔ¼ÊøµÄ¼¼ÇÉÁË¡£

ÌáǰÉèÖà contentSize

// ÌáǰÉèÖúà UIScrollView µÄ contentSize£¬²¢ÉèÖà UIScrollView ×ÔÉíµÄÔ¼Êø
self.scrollView.contentSize = CGSizeMake(1000, 1000);
[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];

// ËäÈ» redView µÄ get ·½·¨ÄÚ²¿ÒѾ­Ö´Ðйý addSubview ²Ù×÷£¬µ«ÊÇ UIView ʼÖÕÒÔ×îºóÒ»´ÎÌí¼ÓµÄ¸¸ÊÓͼΪ׼£¬Ò²¾ÍÊÇ redView ʼÖÕÊÇÔÚ×îºóÒ»´ÎÌí¼ÓµÄ¸¸ÊÓͼÉÏ¡£
[self.scrollView addSubview:self.redView];
[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(self.scrollView);
make.width.height.mas_equalTo(200);
}];

[self.scrollView addSubview:self.blueView];
[self.blueView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.redView.mas_right);
make.top.equalTo(self.scrollView);
make.width.height.equalTo(self.redView);
}];

[self.scrollView addSubview:self.greenView];
[self.greenView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.scrollView);
make.top.equalTo(self.redView.mas_bottom);
make.width.height.equalTo(self.redView);
}];

×Ô¶¯ contentSize

ÉÏÃæµÄÀý×ÓÊÇÌáǰÉèÖúÃUIScrollViewµÄcontentSizeµÄÄÚ²¿size£¬È»ºóÖ±½ÓÏòÀïÃæaddSubview¡£µ«ÊÇÕâÓиöÒªÇó¾ÍÊÇ£¬ÐèÒªÌáǰ֪µÀcontentSizeµÄ´óС£¬²»È»Ã»·¨ÉèÖá£

Õâ¸öÀý×ÓÖн«»áչʾ¶¯Ì¬¸Ä±äcontentSizeµÄ´óС£¬ÄÚ²¿ÊÓͼÓжàÉÙcontentSize¾Í×Ô¶¯À©³äµ½¶à´ó¡£

ÕâÖÖ·½Ê½µÄʵÏÖ£¬Ö÷ÒªÊÇÒÀÀµÓÚ´´½¨Ò»¸öcontainerViewÄÚÈÝÊÓͼ£¬²¢Ìí¼Óµ½UIScrollViewÉÏ×÷Ϊ×ÓÊÓͼ¡£UIScrollViewÔ­À´µÄ×ÓÊÓͼ¶¼Ìí¼Óµ½containerViewÉÏ£¬²¢ÇÒºÍÕâ¸öÊÓͼÉèÖÃÔ¼Êø¡£

ÒòΪ¶ÔUIScrollView½øÐÐaddSubview²Ù×÷µÄʱºò£¬±¾ÖÊÉÏÊÇÍùÆäcontentViewÉÏÌí¼Ó¡£Ò²¾ÍÊÇcontainerViewµÄ¸¸ÊÓͼÊÇcontentView£¬Í¨¹ýcontainerView³ÅÆðcontentViewÊÓͼµÄ´óС£¬ÒÔ´ËÀ´ÊµÏÖ¶¯Ì¬¸Ä±äcontentSize¡£

// ÔÚ½øÐÐÔ¼ÊøµÄʱºò£¬Òª¶Ô containerView µÄÉÏÏÂ×óÓÒ¶¼Ìí¼ÓºÍ×ÓÊÓͼµÄÔ¼Êø£¬ÒÔ±ãÈ·ÈÏ containerView µÄ±ß½çÇøÓò¡£
[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];

CGFloat padding = LXZViewPadding;
[self.containerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.scrollView).insets(UIEdgeInsetsMake(padding, padding, padding, padding));
}];

[self.containerView addSubview:self.greenView];
[self.greenView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.equalTo(self.containerView).offset(padding);
make.size.mas_equalTo(CGSizeMake(250, 250));
}];

[self.containerView addSubview:self.redView];
[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.containerView).offset(padding);
make.left.equalTo(self.greenView.mas_right).offset(padding);
make.size.equalTo(self.greenView);
make.right.equalTo(self.containerView).offset(-padding);
}];

[self.containerView addSubview:self.yellowView];
[self.yellowView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.containerView).offset(padding);
make.top.equalTo(self.greenView.mas_bottom).offset(padding);
make.size.equalTo(self.greenView);
make.bottom.equalTo(self.containerView).offset(-padding);
}];

   
3075 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ