කතන්දර පුවරුව, කේතය, ඉඟි සහ ගොට්චා කිහිපයක්
අනෙක් පිළිතුරු ඉතා හොඳයි, නමුත් මෙය මෑත උදාහරණයක් භාවිතා කරමින් සජීවිකරණ අවහිරතා පිළිබඳ තරමක් වැදගත් කරුණු කිහිපයක් ඉස්මතු කරයි. පහත දැක්වෙන කරුණු අවබෝධ කර ගැනීමට පෙර මම බොහෝ වෙනස්කම් වලට භාජනය විය:
ප්රබල යොමු කිරීමක් සඳහා පන්ති විචල්යයන් වෙත ඉලක්ක කිරීමට ඔබට අවශ්ය බාධක සාදන්න. ස්විෆ්ට්හිදී මම කම්මැලි විචල්යයන් භාවිතා කළෙමි:
lazy var centerYInflection:NSLayoutConstraint = {
let temp = self.view.constraints.filter({ $0.firstItem is MNGStarRating }).filter ( { $0.secondItem is UIWebView }).filter({ $0.firstAttribute == .CenterY }).first
return temp!
}()
සමහර අත්හදා බැලීම පසු මම එක් දැක්ම සිට අවහිරතා ලබා ගත යුතු බව සඳහන් සෙවණක් (මෙම superview හෙවත්) එම අවහිරතා අර්ථ දක්වා ඇත එහිදී දෙදෙනා අදහස්. පහත උදාහරණයේ (MNGStarRating සහ UIWebView යන දෙකම මා අතර අවහිරයක් නිර්මාණය කරන අයිතම වර්ග දෙක වන අතර ඒවා ස්වයං දර්ශනය තුළ උප දර්ශන වේ).
පෙරහන් දාමය
මම ස්විෆ්ට් හි පෙරහන් ක්රමයෙන් ප්රයෝජන ගන්නේ අපේක්ෂිත අවහිරතා වෙන් කිරීමටයි. කෙනෙකුට වඩාත් සංකීර්ණ විය හැකි නමුත් පෙරණය මෙහි හොඳ කාර්යයක් කරයි.
ස්විෆ්ට් භාවිතයෙන් අවහිරතා සජීවිකරණය කිරීම
Nota Bene - මෙම උදාහරණය කතන්දර පුවරුව / කේත විසඳුම වන අතර යමෙකු කතන්දර පුවරුවේ පෙරනිමි බාධක ඇති කර ඇතැයි උපකල්පනය කරයි. එවිට කෙනෙකුට කේත භාවිතයෙන් වෙනස්කම් සජීවීකරණය කළ හැකිය.
නිවැරදි නිර්ණායකයන් සමඟ පෙරීමට සහ ඔබේ සජීවිකරණය සඳහා නිශ්චිත ප්රේරක ලක්ෂ්යයකට පිවිසීමට ඔබ දේපලක් නිර්මාණය කර ඇතැයි උපකල්පනය කිරීම (ඇත්ත වශයෙන්ම ඔබට අරාව සඳහා පෙරහන් කළ හැකි අතර ඔබට බහු අවහිරතා අවශ්ය නම් ඒවා හරහා ලූපයක් ලබා ගත හැකිය):
lazy var centerYInflection:NSLayoutConstraint = {
let temp = self.view.constraints.filter({ $0.firstItem is MNGStarRating }).filter ( { $0.secondItem is UIWebView }).filter({ $0.firstAttribute == .CenterY }).first
return temp!
}()
....
ටික කාලයකට පසුව...
@IBAction func toggleRatingView (sender:AnyObject){
let aPointAboveScene = -(max(UIScreen.mainScreen().bounds.width,UIScreen.mainScreen().bounds.height) * 2.0)
self.view.layoutIfNeeded()
//Use any animation you want, I like the bounce in springVelocity...
UIView.animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.75, options: [.CurveEaseOut], animations: { () -> Void in
//I use the frames to determine if the view is on-screen
if CGRectContainsRect(self.view.frame, self.ratingView.frame) {
//in frame ~ animate away
//I play a sound to give the animation some life
self.centerYInflection.constant = aPointAboveScene
self.centerYInflection.priority = UILayoutPriority(950)
} else {
//I play a different sound just to keep the user engaged
//out of frame ~ animate into scene
self.centerYInflection.constant = 0
self.centerYInflection.priority = UILayoutPriority(950)
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
}) { (success) -> Void in
//do something else
}
}
}
බොහෝ වැරදි හැරීම්
මෙම සටහන් සැබවින්ම මා විසින්ම ලියන ලද ඉඟි සමූහයකි. මම නොකළ යුතු සියල්ල පෞද්ගලිකව හා වේදනාකාරී ලෙස කළෙමි. මෙම මාර්ගෝපදේශය අන් අයගෙන් බේරීමට බලාපොරොත්තු වේ.
ZPositioning ගැන විමසිල්ලෙන් සිටින්න. සමහර විට කිසිවක් පෙනෙන්නට නැති විට, ඔබ වෙනත් දර්ශන කිහිපයක් සැඟවිය යුතුය, නැතහොත් ඔබේ සජීවිකරණ දර්ශනය සොයා ගැනීමට දර්ශන නිදොස්කරණය භාවිතා කළ යුතුය. කතන්දර පුවරුවේ එක්ස්එම්එල් තුළ පරිශීලක අර්ථ දක්වන ලද ධාවන කාල ගුණාංගයක් නැතිවී ගොස් සජීවිකරණ දර්ශනය ආවරණය කිරීමට හේතු වූ අවස්ථා (වැඩ කරන අතරතුර) මම සොයාගෙන ඇත.
ප්රලේඛනය (නව සහ පැරණි), ඉක්මන් උදව් සහ ශීර්ෂ කියවීමට සෑම විටම විනාඩියක් ගත කරන්න. ස්වයංක්රීය සැකසුම් අවහිරතා වඩා හොඳින් කළමනාකරණය කිරීම සඳහා ඇපල් විසින් බොහෝ වෙනස්කම් සිදු කරයි (තොග දර්ශන බලන්න). නැතහොත් අවම වශයෙන් ස්වයංක්රීය සැකසුම් කුක් පොත . සමහර විට හොඳම විසඳුම් පැරණි ලියකියවිලි / වීඩියෝවල ඇති බව මතක තබා ගන්න.
සජීවිකරණයේ අගයන් සමඟ සෙල්ලම් කර වෙනත් සජීවිකරණ විත් ඩියුරේෂන් ප්රභේද භාවිතා කිරීම ගැන සලකා බලන්න.
වෙනත් නියතයන්හි වෙනස්කම් තීරණය කිරීමේ නිර්ණායකයක් ලෙස නිශ්චිත පිරිසැලසුම් අගයන් දෘඩ කේතනය නොකරන්න, ඒ වෙනුවට දර්ශනයේ පිහිටීම තීරණය කිරීමට ඔබට ඉඩ සලසන අගයන් භාවිතා කරන්න. CGRectContainsRect
එක් උදාහරණයක්
- අවශ්ය නම්, අවහිරතා අර්ථ දැක්වීමට සහභාගී වන දර්ශනයක් හා සම්බන්ධ පිරිසැලසුම් ආන්තිකයන් භාවිතා කිරීමට පසුබට නොවන්න
let viewMargins = self.webview.layoutMarginsGuide
: උදාහරණයක් ලෙස
- ඔබට කළ යුතු වැඩ නොකරන්න, කතන්දර පුවරුවේ ඇති සීමාවන් සහිත සියලුම දර්ශන වලට දේපල ස්වයං අවහිරතා ඇත. View.ameName.constraints
- ඕනෑම බාධාවක් සඳහා ඔබේ ප්රමුඛතා 1000 ට අඩු කරන්න. මම කතන්දර පුවරුවේ මගේ 250 (අඩු) හෝ 750 (ඉහළ) ලෙස සකසා ඇත; (ඔබ කේතයේ ඇති ඕනෑම දෙයකට ප්රමුඛතාවය 1000 ක් වෙනස් කිරීමට උත්සාහ කළහොත් 1000 ක් අවශ්ය බැවින් යෙදුම බිඳ වැටෙනු ඇත)
- සක්රීය කොන්ස්ට්රයින්ට්ස් සහ අක්රිය කිරීමේ කොන්ක්රීට් භාවිතා කිරීමට වහාම උත්සාහ නොකිරීම ගැන සලකා බලන්න (ඒවාට ඒවායේ ස්ථානයක් ඇත, නමුත් ඉගෙන ගන්නා විට හෝ ඔබ මේවා භාවිතා කරමින් කතන්දර පුවරුවක් භාවිතා කරන්නේ නම් බොහෝ විට එයින් අදහස් කරන්නේ ඔබ ඕනෑවට වඩා වැඩ කිරීමයි ~ පහත දැක්වෙන පරිදි ඔවුන්ට ස්ථානයක් ඇත)
- ඔබ කේතයේ නව බාධකයක් සැබවින්ම එකතු කරන්නේ නම් මිස addConstraints / removeConstraints භාවිතා නොකිරීමට සලකා බලන්න. බොහෝ විට මම කතන්දර පුවරුවේ අදහස් අපේක්ෂිත බාධක සහිතව (දර්ශනය ඕෆ්ස්ක්රීන් මත තැබීම) සැකසූ බව මට පෙනී ගියේය, ඉන්පසු කේතයෙන්, දර්ශනය වටා ගමන් කිරීම සඳහා කතන්දර පුවරුවේ කලින් නිර්මාණය කර ඇති බාධක සජීවීකරණය කරමි.
- නව NSAnchorLayout පන්තිය සහ උප පංති සමඟ බාධක ගොඩ නැගීමට මම බොහෝ කාලයක් නාස්ති කළෙමි. මේවා ඉතා හොඳින් ක්රියාත්මක වන නමුත් මට අවශ්ය සියලු අවහිරතා දැනටමත් කතන්දර පුවරුවේ පවතින බව වටහා ගැනීමට මට යම් කාලයක් ගත විය. ඔබ කේතයේ සීමාවන් ගොඩනඟන්නේ නම්, ඔබේ අවහිරතා සමනය කිරීමට මෙම ක්රමය භාවිතා කරන්න:
කතන්දර පුවරු භාවිතා කරන විට AVOID සඳහා විසඳුම් සඳහා ඉක්මන් නියැදිය
private var _nc:[NSLayoutConstraint] = []
lazy var newConstraints:[NSLayoutConstraint] = {
if !(self._nc.isEmpty) {
return self._nc
}
let viewMargins = self.webview.layoutMarginsGuide
let minimumScreenWidth = min(UIScreen.mainScreen().bounds.width,UIScreen.mainScreen().bounds.height)
let centerY = self.ratingView.centerYAnchor.constraintEqualToAnchor(self.webview.centerYAnchor)
centerY.constant = -1000.0
centerY.priority = (950)
let centerX = self.ratingView.centerXAnchor.constraintEqualToAnchor(self.webview.centerXAnchor)
centerX.priority = (950)
if let buttonConstraints = self.originalRatingViewConstraints?.filter({
($0.firstItem is UIButton || $0.secondItem is UIButton )
}) {
self._nc.appendContentsOf(buttonConstraints)
}
self._nc.append( centerY)
self._nc.append( centerX)
self._nc.append (self.ratingView.leadingAnchor.constraintEqualToAnchor(viewMargins.leadingAnchor, constant: 10.0))
self._nc.append (self.ratingView.trailingAnchor.constraintEqualToAnchor(viewMargins.trailingAnchor, constant: 10.0))
self._nc.append (self.ratingView.widthAnchor.constraintEqualToConstant((minimumScreenWidth - 20.0)))
self._nc.append (self.ratingView.heightAnchor.constraintEqualToConstant(200.0))
return self._nc
}()
ඔබට මෙම ඉඟි වලින් එකක් හෝ පිරිසැලසුම එකතු කළ යුතු ස්ථානය වැනි සරල ඒවා අමතක වුවහොත් බොහෝ දුරට කිසිවක් සිදු නොවනු ඇත: එවැනි අවස්ථාවකදී ඔබට මේ වගේ අඩක් බේක් කළ විසඳුමක් තිබිය හැකිය:
සැ.යු - පහත දැක්වෙන ස්වයංක්රීය සැකසුම් කොටස සහ මුල් මාර්ගෝපදේශය කියවීමට මොහොතක් ගත කරන්න. ඔබේ ගතික සජිවිකරණ සඳහා අතිරේකව මෙම ශිල්පීය ක්රම භාවිතා කිරීමට ක්රමයක් තිබේ.
UIView.animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 1.0, options: [.CurveEaseOut], animations: { () -> Void in
//
if self.starTopInflectionPoint.constant < 0 {
//-3000
//offscreen
self.starTopInflectionPoint.constant = self.navigationController?.navigationBar.bounds.height ?? 0
self.changeConstraintPriority([self.starTopInflectionPoint], value: UILayoutPriority(950), forView: self.ratingView)
} else {
self.starTopInflectionPoint.constant = -3000
self.changeConstraintPriority([self.starTopInflectionPoint], value: UILayoutPriority(950), forView: self.ratingView)
}
}) { (success) -> Void in
//do something else
}
}
ස්වයංක්රීය සැකසුම් මාර්ගෝපදේශයේ ස්නිපටය (දෙවන ස්නිපටය OS X භාවිතා කිරීම සඳහා බව සලකන්න). BTW - මෙය මට පෙනෙන පරිදි වර්තමාන මාර්ගෝපදේශයේ තවදුරටත් නොමැත. කැමති තාක්ෂණික ක්රම අඛණ්ඩව විකාශනය වෙමින් පවතී.
ස්වයංක්රීය පිරිසැලසුම මඟින් සිදුකරන වෙනස්කම් සජීවිකරණය කිරීම
ස්වයංක්රීය පිරිසැලසුම මගින් සිදුකරන සජීවිකරණ වෙනස්කම් පිළිබඳ පූර්ණ පාලනයක් ඔබට අවශ්ය නම්, ඔබ ඔබේ බාධක ක්රමලේඛන වෙනස් කළ යුතුය. මූලික සංකල්පය iOS සහ OS X යන දෙකටම සමාන වේ, නමුත් සුළු වෙනස්කම් කිහිපයක් තිබේ.
IOS යෙදුමක, ඔබගේ කේතය පහත දැක්වෙන ආකාරයට පෙනේ:
[containerView layoutIfNeeded]; // Ensures that all pending layout operations have been completed
[UIView animateWithDuration:1.0 animations:^{
// Make all constraint changes here
[containerView layoutIfNeeded]; // Forces the layout of the subtree animation block and then captures all of the frame changes
}];
OS X හි, ස්ථර-පිටුබලය සහිත සජීවිකරණ භාවිතා කරන විට පහත කේතය භාවිතා කරන්න:
[containterView layoutSubtreeIfNeeded];
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
[context setAllowsImplicitAnimation: YES];
// Make all constraint changes here
[containerView layoutSubtreeIfNeeded];
}];
ඔබ ස්ථර-පිටුබලය සහිත සජීවිකරණ භාවිතා නොකරන විට, අවහිරතා සජීවිකරණය භාවිතා කරමින් නියතය සජීවීකරණය කළ යුතුය:
[[constraint animator] setConstant:42];
දෘශ්යමය වශයෙන් වඩා හොඳින් ඉගෙන ගන්නා අය සඳහා ඇපල් වෙතින් මෙම මුල් වීඩියෝව බලන්න .
සමීප අවධානයට
බොහෝ විට ලියකියවිලි වල කුඩා සටහන් හෝ කේත කැබලි විශාල අදහස් වලට තුඩු දෙයි. උදාහරණයක් ලෙස ගතික සජීවිකරණ යන්ත්ර සඳහා ස්වයංක්රීය පිරිසැලසුම් සීමාවන් ඇමිණීම විශාල අදහසකි.
සුභ පැතුම් සහ බලවේගය ඔබ සමඟ වේවා.