關(guān)于UIImageView自適應(yīng)的問(wèn)題

因?yàn)椴煌臋C(jī)型的長(zhǎng)寬比不一樣士飒,導(dǎo)致同樣的圖片難于適應(yīng)所有的屏幕刊橘。一般情況下暇矫,需求是image view的寬度跟屏幕一樣主之,根據(jù)實(shí)際情況調(diào)整image view的高度。比如一張685*309像素的圖片李根,在iPhone6上的size是375*167槽奕,而在iPhone6 Plus上則是414*186。為了達(dá)到最優(yōu)的顯示效果房轿,必須根據(jù)圖片的size動(dòng)態(tài)調(diào)整cell的高度粤攒。

圖片的size可以從URL獲取,也可以在SDWebImage這樣的庫(kù)里面的completion block里面獲取囱持,當(dāng)然為了達(dá)到最好的效果夯接,在URL中指明圖片的size是更好的。

在渲染cell的時(shí)候纷妆,先根據(jù)圖片URL的寬長(zhǎng)比钻蹬,得到imageview合理的高度,然后給imageview設(shè)置上這個(gè)高度約束凭需。我發(fā)現(xiàn)一個(gè)有趣的問(wèn)題问欠,就是AutoLayout會(huì)影響UIImageView的contentMode,即使指定了ScaleAspectFit粒蜈,同樣會(huì)拉伸圖片顺献,造成變形。

final class TestViewCellUseConstraint : UITableViewCell {

    var imgViewHeightConstraint : Constraint?

    lazy var imgView : UIImageView = {
        let imgView = UIImageView()
        imgView.contentMode = UIViewContentMode.ScaleAspectFill
        imgView.clipsToBounds = true
        self.contentView.addSubview(imgView)

        return imgView
    }()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        self.contentView.backgroundColor = UIColor.redColor()

        self.imgView.snp_makeConstraints { (make) -> Void in
            make.leading.equalTo(0)
            make.trailing.equalTo(0)
            make.top.equalTo(8)
            //給一個(gè)默認(rèn)的高度值
            self.imgViewHeightConstraint = make.height.equalTo(154.5).constraint
            make.bottom.equalTo(self.contentView.snp_bottom).offset(0)
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

final class TestViewController : YWSBaseUITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.separatorStyle = .None
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let image = UIImage(named: "aliyun_sz")!

        let cell = TestViewCellUseConstraint()
        cell.imgView.image = image
        cell.imgViewHeightConstraint?.updateOffset(floor(DeviceUtils.getScreenWidth()/(image.size.width / image.size.height)))
        cell.setNeedsUpdateConstraints()

        return cell
    }
}

最后需要注意的是枯怖,在計(jì)算高度的時(shí)候應(yīng)該避免出現(xiàn)少數(shù)點(diǎn)的約束注整,否則可能產(chǎn)生下面這樣的約束沖突。image view的高度計(jì)算出來(lái)是186.753280639648,而content view計(jì)算出來(lái)的高度則是186.667肿轨,二者不一樣寿冕,但是我指明二者的高度是一樣的,iOS會(huì)選擇丟掉一個(gè)約束椒袍。

2016-03-16 18:02:06.930 CloudConsoleApp[74807:15177377] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<SnapKit.LayoutConstraint:0x7fab951e80d0@/Users/henshao/cloudconsole-iOS/CloudConsoleApp/YWSMyViewController.swift#336 UIImageView:0x7fab95537d80.top == UITableViewCellContentView:0x7fab95537970.top>",
    "<SnapKit.LayoutConstraint:0x7fab951e8620@/Users/henshao/cloudconsole-iOS/CloudConsoleApp/YWSMyViewController.swift#336 UIImageView:0x7fab95537d80.height == 186.753280639648>",
    "<SnapKit.LayoutConstraint:0x7fab951e8a60@/Users/henshao/cloudconsole-iOS/CloudConsoleApp/YWSMyViewController.swift#336 UIImageView:0x7fab95537d80.bottom == UITableViewCellContentView:0x7fab95537970.bottom>",
    "<NSLayoutConstraint:0x7fab951e9940 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fab95537970(186.667)]>"
)

Will attempt to recover by breaking constraint 
<SnapKit.LayoutConstraint:0x7fab951e8620@/Users/henshao/cloudconsole-iOS/CloudConsoleApp/YWSMyViewController.swift#336 UIImageView:0x7fab95537d80.height == 186.753280639648>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

UILabel的長(zhǎng)度和寬度是根據(jù)字體自適應(yīng)的驼唱,如果UIImageView也擁有這種特性就好了啊,指定寬度驹暑,高度上的約束自適應(yīng)玫恳,省多少事啊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末优俘,一起剝皮案震驚了整個(gè)濱河市京办,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帆焕,老刑警劉巖惭婿,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叶雹,居然都是意外死亡审孽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)浑娜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)佑力,“玉大人,你說(shuō)我怎么就攤上這事筋遭〈虿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵漓滔,是天一觀的道長(zhǎng)编饺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)响驴,這世上最難降的妖魔是什么透且? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮豁鲤,結(jié)果婚禮上秽誊,老公的妹妹穿的比我還像新娘。我一直安慰自己琳骡,他們只是感情好锅论,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著楣号,像睡著了一般最易。 火紅的嫁衣襯著肌膚如雪怒坯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天藻懒,我揣著相機(jī)與錄音剔猿,去河邊找鬼。 笑死嬉荆,一個(gè)胖子當(dāng)著我的面吹牛归敬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播员寇,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼弄慰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼第美!你這毒婦竟也來(lái)了蝶锋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤什往,失蹤者是張志新(化名)和其女友劉穎扳缕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體别威,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躯舔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了省古。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粥庄。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖豺妓,靈堂內(nèi)的尸體忽然破棺而出惜互,到底是詐尸還是另有隱情,我是刑警寧澤琳拭,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布训堆,位于F島的核電站,受9級(jí)特大地震影響白嘁,放射性物質(zhì)發(fā)生泄漏坑鱼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一絮缅、第九天 我趴在偏房一處隱蔽的房頂上張望鲁沥。 院中可真熱鬧,春花似錦耕魄、人聲如沸黍析。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阐枣。三九已至马靠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔼两,已是汗流浹背甩鳄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留额划,地道東北人妙啃。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像俊戳,于是被迫代替她去往敵國(guó)和親揖赴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • Chapter 1 構(gòu)建自適應(yīng)用戶(hù)界面 @(Intermediate iOS 10 Programming wit...
    劉銘iOS閱讀 1,855評(píng)論 0 1
  • 1.自定義控件 a.繼承某個(gè)控件 b.重寫(xiě)initWithFrame方法可以設(shè)置一些它的屬性 c.在layouts...
    圍繞的城閱讀 3,391評(píng)論 2 4
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)抑胎、插件燥滑、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,107評(píng)論 4 62
  • 1.尺寸適配1.原因 iOS7中所有導(dǎo)航欄都為半透明,導(dǎo)航欄(height=44)和狀態(tài)欄(height=20)不...
    LZM輪回閱讀 6,116評(píng)論 1 4
  • 什么是維基百科搀菩?如果你不知道這個(gè)的話,也不用繼續(xù)往下看了破托,因?yàn)槟赡懿恍枰@個(gè)肪跋。 為何用維基 最近參加了古典老師的...
    大鵬80閱讀 33,935評(píng)論 1 4