ǰÑÔ
Ŀǰ 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);
}]; |
|