UIPopoverController рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛

UIPopoverController рдпрд╛ рдкреЙрдк-рдЕрдк рд╡рд┐рдВрдбреЛ (рдЗрд╕рдХреЗ рдмрд╛рдж рдмрд╕ "рдкреЙрдкрдУрд╡рд░") рддрддреНрд╡ рдирдП рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред Habr├й рдкрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд▓реЗрдЦ рд╣реИ рдФрд░ рдЕрдиреНрдп рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рдХрдИ рд╕рдВрджрд░реНрдн рд╣реИрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдкреЙрдкрдУрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ "рдХреЗ рд░реВрдк рдореЗрдВ" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рд╕рдВрд╢реЛрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕ рддрддреНрд╡ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдЖрд▓реЗрдЦ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рдПрдХ рд▓реЗрдЦ рдХреЗрд╡рд▓ Apple рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдпрд╛ рдкреБрдирд░реНрдкреНрд░рдХрд╛рд╢рди рдирд╣реАрдВ рд╣реИред рдореИрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЦреБрдж рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ (рд╢рдмреНрдж рдХреЗ рдЕрдЪреНрдЫреЗ рдЕрд░реНрде рдореЗрдВ), рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рддреИрдпрд╛рд░ рдХрд┐рдпрд╛, рдФрд░ рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рд╕рдм рдПрдХ рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡реА рдХрд┐рдпрд╛, рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдЖ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдерд╛, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдЖрд╡реЗрджрди iPhone рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ "рдкреВрд░рд╛", рдЕрд░реНрдерд╛рддреН, UINavigationBar рдХреНрд▓рд╛рд╕ рдХреА appearance рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

 [[UINavigationBar appearance] setTintColor: [UIColor colorWithRed:0.481 green:0.065 blue:0.081 alpha:1.000]]; [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navbar"] forBarMetrics:UIBarMetricsDefault]; 

рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛:

рдЬрдм рдЙрдиреНрд╣реЛрдВрдиреЗ рдореМрдЬреВрджрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ iPad рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдЙрдиреНрд╣реЗрдВ UINavigationController рдЕрдВрджрд░ UINavigationController рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдпрджрд┐ рдЖрдк рдкреЙрдкрдУрд╡рд░ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ UINavigationBar рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрдкрд╕реНрдерд┐рддрд┐ рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ
 [[UINavigationBar appearanceWhenContainedIn:[UIPopoverController class], nil] setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; [[UINavigationBar appearanceWhenContainedIn:[UIPopoverController class], nil] setTintColor:[UIColor clearColor]]; 


рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдШрд╛рддрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди, рдХрд╣рддреЗ рд╣реИрдВ, рдЧреНрд░рд╛рд╣рдХ (рдФрд░ рд╡рд╣ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рд╣реИ) рдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ рдФрд░ "рдкреЙрдкрдУрд╡рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдпрд╛рдж рдХрд░реЗрдЧрд╛!" рдпрд╣ рд╡рд╣ popoverBackgroundViewClass рд╣реИ popoverBackgroundViewClass рд╡рд░реНрдЧ popoverBackgroundViewClass рд╕рдВрдкрддреНрддрд┐ UIPopoverController ред рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп UIPopoverBackgroundView рд╡рд░реНрдЧ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ UIPopoverBackgroundView , рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдмрд╛рджред

рдПрдХ UIPopoverBackgroundView


рдкреНрд░рд▓реЗрдЦрди, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдФрд░ рдХреНрдпреЛрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рджреА рдЧрдИ рд╣реИрдВ - рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ рддреАрд░ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐рдпреЛрдВ рдФрд░ UIImageView рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдпрд╣ рд╕рдм "рд╢рдмреНрджреЛрдВ рдореЗрдВ" рд╣реИ, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкрд╛рда рдХреЛ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдиреБрднрд╡ рдХрд░рддрд╛ рд╣реВрдВ рдпрджрд┐ рдЪрд┐рддреНрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрд▓рдЧреНрди рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕ "рдЕрдВрддрд░" рдХреЛ рднрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ, рд╣рдо UIPopoverBackgroundView рдХреЗ рд╣рдорд╛рд░реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ рдХреЗрд╡рд▓ рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЕрдм рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВред

 #import <UIKit/UIPopoverBackgroundView.h> @interface MBPopoverBackgroundView : UIPopoverBackgroundView @end 


рдПрдХ UIPopoverController рд╢рд░реАрд░ рд░рдЪрдирд╛ UIPopoverController


UIPopoverController рдореЗрдВ рдПрдХ рдПрд░реЛ (рдПрд░реЛ), рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб (рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб), рдХрдВрдЯреЗрдВрдЯ рдпрд╛ рдХрдВрдЯреЗрдВрдЯ (рдХрдВрдЯреЗрдВрдЯ рд╡реНрдпреВ), рдФрд░ рдпреВрдЖрдИрд╡рд╛рдИрдпреВрд╡рд╛рдИ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕рд╛рд░рд╛ рд╕рд╛рдорд╛рди рд╕рдорд╛рд╣рд┐рдд рдФрд░ рд░реЗрдВрдбрд░ рд╣реЛрддрд╛ рд╣реИред

рддреАрд░

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ "рддреАрд░" рдПрдХ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЖрд▓рдВрдХрд╛рд░рд┐рдХ рд╢рдмреНрдж рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдЕрдкрдиреА рдХрд▓реНрдкрдирд╛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИрдВ, рддреАрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдзрд░рд╛рд╢рд╛рдпреА рд░реЗрдЦрд╛, рдПрдХ рд╡рдХреНрд░, рдПрдХ рдордирдорд╛рдирд╛ рдЪрд┐рддреНрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдУрд╡рд░рд░рд╛рдЗрдб draw рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл UIView рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ gl*** рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдбреНрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдПрдирд┐рдореЗрдЯреЗрдб UIImageView рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛рдж рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдПрдХрдорд╛рддреНрд░ рдЪреАрдЬрд╝ рддреАрд░ рдХреЗ рдЖрдзрд╛рд░ ( arrowBase ) рдХреА рдЪреМрдбрд╝рд╛рдИ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдКрдВрдЪрд╛рдИ ( arrowHeight ) рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рджрд░рдХрд┐рдирд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред

рдЕрднреА рдХреЗ рд▓рд┐рдП, UIImageView Apple рдХреА рд╕рд▓рд╛рд╣ рдХреЗ рдмрд╛рдж, рддреАрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ UIImageView рд▓рд┐рдП рдПрдХ UIImageView рдЪреБрдиреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд░реНрдЧ +(CGFloat)arrowBase рдФрд░ +(CGFloat)arrowHeight рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди +(CGFloat)arrowHeight ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╡реЗ рджреЛрдиреЛрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЙрдкрд╡рд░реНрдЧ рдореЗрдВ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рд╕реНрддреБрддрд┐ рдХреА рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрд░ рдХреА рдЫрд╡рд┐ рд╣реИ рдФрд░ рдЗрд╕реЗ "popover-arrow.ng" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдм рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 @interface MBPopoverBackgroundView () // image view   @property (nonatomic, strong) UIImageView *arrowImageView; @end @implementation MBPopoverBackgroundView @synthesize arrowImageView = _arrowImageView; //   (arrow base) + (CGFloat)arrowBase { //    return [UIImage imageNamed:@"popover-arrow.png"].size.width; } //   (arrow height) + (CGFloat)arrowHeight { //    return [UIImage imageNamed:@"popover-arrow.png"].size.height; } //  - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (!self) return nil; //  image view   self.arrowImageView = [[UIImageView alloc] initWithImage:@"popover-arrow.png"]; [self addSubview:_arrowImageView]; return self; } @end 


рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рддреАрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рджреЛ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рдкрдЫрд╛рдбрд╝рдирд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
 @property (nonatomic, readwrite) UIPopoverArrowDirection arrowDirection; @property (nonatomic, readwrite) CGFloat arrowOffset; 

рдЕрдиреНрдпрдерд╛, рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд░ рдпрд╛ рдЧреЗрдЯреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╣реА рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдВрдЧреЗред

рддреАрд░ рдХреА рджрд┐рд╢рд╛ ( arrowDirection ) рд╣рдореЗрдВ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рддреАрд░ рдХрд╣рд╛рдБ (рдКрдкрд░, рдиреАрдЪреЗ, рдмрд╛рдПрдБ, рджрд╛рдПрдБ) рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд╣рд╛рдБ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИред рдПрд░реЛ рдСрдлрд╕реЗрдЯ ( arrowOffset ) рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреЗ рдХреЗрдВрджреНрд░ рд╕реЗ рддреАрд░ рдХреА рдХреЗрдВрджреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рддрдХ рдХреА рджреВрд░реА рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЪрд┐рддреНрд░рдг рдХреЛ рджреЗрдЦреЗрдВ, рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдСрдлрд╕реЗрдЯ рдиреАрд▓реЗ рд░рдВрдЧ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВред рдСрдлрд╕реЗрдЯ рдФрд░ рдмрд╛рдИрдВ рдУрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рд╣реИред


рдкреНрд░рд▓реЗрдЦрди рдЗрди рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд░ рдФрд░ рдЧреЗрдЯреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЖрдк рдЗрди рдЧреБрдгреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 @interface MBPopoverBackgroundView () //       @property (nonatomic, readwrite) UIPopoverArrowDirection arrowDirection; @property (nonatomic, readwrite) CGFloat arrowOffset; @end @implementation MBPopoverBackgroundView @synthesize arrowDirection = _arrowDirection; @synthesize arrowOffset = _arrowOffset; @end 


рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдЧреБрдг рдХреЛ рдмрджрд▓рдирд╛ рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рддреАрд░ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╕реНрдерд╛рди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЕрд╡рд▓реЛрдХрди рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЬреИрд╕реЗ рд╣реА рд╕рдВрдкрддреНрддрд┐ рдмрджрд▓ рдЧрдИ рд╣реИ - рд╣рдореЗрдВ рд╣рдорд╛рд░реЗ MBPopoverBackgroundView рдХреЛ MBPopoverBackgroundView рдХрд┐ рдпрд╣ рд╕рдордп рд╣реИ рдХрд┐ рдмрдЪреНрдЪреЛрдВ рдХреЛ ( MBPopoverBackgroundView - MBPopoverBackgroundView ) рдХреЛ рдЙрдирдХреЗ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╛рдиреАред рдХреЙрд▓ setNeedsLayout рдпрд╣, рдмрджрд▓реЗ рдореЗрдВ, рдЕрдЧрд▓реЗ рдЙрдкрдпреБрдХреНрдд рдХреНрд╖рдг (рдЬрдм рд╡рд╛рд╕реНрддрд╡ layoutSubviews рдУрдПрд╕ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ) рдкрд░ layoutSubviews рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред layoutSubviews рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

 - (id)initWithFrame:(CGRect)frame { // ***   *** [self addObserver:self forKeyPath:@"arrowDirection" options:0 context:nil]; [self addObserver:self forKeyPath:@"arrowOffset" options:0 context:nil]; return self; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { //         //         setNeedsLayout [self setNeedsLayout]; } - (void)dealloc { [self removeObserver:self forKeyPath:@"arrowDirection"]; [self removeObserver:self forKeyPath:@"arrowOffset"]; // ***  "" *** [super dealloc]; } 


рдкреГрд╖реНрдарднреВрдорд┐

рддреАрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП UIImageView рднреА рдЪреБрдиреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди, рдЬрдмрдХрд┐ рддреАрд░ рдЕрдкрдирд╛ рдЖрдХрд╛рд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдкреГрд╖реНрдарднреВрдорд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИред рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ, рдЖрдк рдХрдИ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЕрдВрджрд░ рдкреЙрдкрдУрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЫреЛрдЯреЗ рдЯреВрд▓рдЯрд┐рдк рдФрд░ рд╕реНрдХреНрд░реАрди рдХреЗ рдлрд░реНрд╢ рдкрд░ рдЕрдХрд▓реНрдкрдиреАрдп рдкреЙрдкрдУрд╡рд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрдарднреВрдорд┐ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдПред Apple resizableImageWithCapInsets:(UIEdgeInsets)capInsets рдЗрдореЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ; UIImageView рд╡рд░реНрдЧ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП resizableImageWithCapInsets:(UIEdgeInsets)capInsets рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреГрд╖реНрдарднреВрдорд┐ рдмрдирд╛рдИ, рдЧреЛрд▓ рдХреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ 128x128 рдЖрдпрдд рдФрд░ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ, рдЫрд╛рдпрд╛ рдФрд░ рдЕрдиреНрдп рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд░рдВрдЧ рд╕реЗ рднрд░рд╛ред рдлрд╝рд╛рдЗрд▓ рдХреЛ "popover-background.png" рдирд╛рдо рджреЗрдВред

 @property (nonatomic, strong) UIImageView *backgroundImageView; // *** @synthesize backgroundImageView = _backgroundImageView; - (id)initWithFrame:(CGRect)frame { // *** UIEdgeInsets bgCapInsets = UIEdgeInsetsMake(12, 12, 12, 12); UIImage *bgImage = [[UIImage imageNamed:@"popover-backgroung.png"] resizableImageWithCapInsets:bgCapInsets]; self.backgroundImageView = [[UIImageView alloc] initWithImage:bgImage]; [self addSubview:_backgroundImageView]; // *** } 


UIEdgeInsets рд╡рд┐рдХрд▓реНрдк рдЗрдВрдбреЗрдВрдЯреЗрд╢рди ( UIEdgeInsets ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рди рдЪрдпрдирд┐рдд рдЫрд╡рд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдиреЛрдВ рдХреА рдЧреЛрд▓рд╛рдИ рддреНрд░рд┐рдЬреНрдпрд╛ 10 рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЛ рд╕рднреА рд╕реАрдорд╛рдУрдВ рд╕реЗ 10 рдХреЗ рдмрд░рд╛рдмрд░ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред


рд╕рд╛рдордЧреНрд░реА

рд╕рд╛рдордЧреНрд░реА рдпрд╛ рд╕рд╛рдордЧреНрд░реА рд╡рд╣ рд╣реИ рдЬреЛ рдкреЙрдкрдУрд╡рд░ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИред UIPopoverBackgroundView рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ UIPopoverBackgroundView рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдордЧреНрд░реА рдФрд░ рдЙрд╕рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЖрдХрд╛рд░ UIPopoverBackgroundView рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП UIPopoverBackgroundView рдХрд╛ рдЖрдХрд╛рд░ред

рдпрд╣рд╛рдБ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм UIPopoverController рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рддреЛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЖрдХрд╛рд░ рдФрд░ рдХрд╣рд╛рдВ рд╕реЗ UIPopoverController рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рддреАрд░ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдХрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдорд╛рд░реЗ MBPopoverBackgroundView рд▓рд┐рдП frame рд╕рдВрдкрддреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред

рдпрд╣ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ +(CGFloat)arrowHeight рдФрд░ +(UIEdgeInsets)contentViewInsets ред рдкрд╣рд▓рд╛ рддреАрд░ рдХреА рдКрдБрдЪрд╛рдИ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдХрд┐рддрдиреА рдЕрдзрд┐рдХ рд╕рд╛рдордЧреНрд░реА рд╣реИ, рд╕рд╛рдордЧреНрд░реА рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рддрдХ рд╕рдВрдХреЗрддрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, UIPopoverController рддреАрд░ рдХреЗ рд▓рд┐рдП рджрд┐рд╢рд╛ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧреА рдФрд░ UIPopoverBackgroundView рд╡рд░реНрдЧ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рд╡рд┐рд╢реЗрд╖ рдЙрдкрд╡рд░реНрдЧ) рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ UIPopoverBackgroundView , рдЗрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдХрд╛рд░ UIPopoverBackgroundView , рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдЕрдкрдирд╛ рддреАрд░ рдФрд░ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд╛рдордЧреНрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд contentViewInsets ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рднреА рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рд╕рдорд╛рди 10 рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдВрдЧреЗред рдЖрдк рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдХреЗрдд рднреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...
 + (UIEdgeInsets)contentViewInsets { //        return UIEdgeInsetsMake(10, 10, 10, 10); } 

рдЕрдм рд╣рдорд╛рд░реА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ 10 рдкрд┐рдХреНрд╕реЗрд▓ рдореЛрдЯреА рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗ рдПрдХ рдлреНрд░реЗрдо рд╣реЛрдЧрд╛ред


рд╕реНрдерд╛рди (рд▓реЗрдЖрдЙрдЯ)

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдВрддрд┐рдо рдЪрд░рдг рддреАрд░ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реНрдерд┐рддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рддреАрд░ рдХреА рджрд┐рд╢рд╛, рдЗрд╕рдХреЗ рдСрдлрд╕реЗрдЯ рдФрд░ рд╣рдорд╛рд░реЗ UIPopoverBackgroundView рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдпрд╛рдореЛрдВ рдХреЛ UIPopoverBackgroundView ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо layoutSubviews рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

 #pragma mark - Subviews Layout //  ,     setNeedsLayout    - (void)layoutSubviews { //          //  CGRect bgRect = self.bounds; //   ,       ""  // ,  / ,    BOOL cutWidth = (_arrowDirection == UIPopoverArrowDirectionLeft || _arrowDirection == UIPopoverArrowDirectionRight); //     ,       bgRect.size.width -= cutWidth * [self.class arrowHeight]; BOOL cutHeight = (_arrowDirection == UIPopoverArrowDirectionUp || _arrowDirection == UIPopoverArrowDirectionDown); //     ,       bgRect.size.height -= cutHeight * [self.class arrowHeight]; // ,   origin point (  ) //      ( )   ( ) if (_arrowDirection == UIPopoverArrowDirectionUp) { bgRect.origin.y += [self.class arrowHeight]; } else if (_arrowDirection == UIPopoverArrowDirectionLeft) { bgRect.origin.x += [self.class arrowHeight]; } //        _backgroundImageView.frame = bgRect; //  -    (arrowDirection)   (arrowOffset)    //   ,     image view      //      (  transformations),      // :          CGRect arrowRect = CGRectZero; UIEdgeInsets bgCapInsets = UIEdgeInsetsMake(12, 12, 12, 12); //      switch (_arrowDirection) { case UIPopoverArrowDirectionUp: _arrowImageView.transform = CGAffineTransformMakeScale(1, 1); //  -  // :  frame,   bounds,   bounds     arrowRect = _arrowImageView.frame; //     origin arrowRect.origin.x = self.bounds.size.width / 2 + _arrowOffset - arrowRect.size.width / 2; arrowRect.origin.y = 0; break; case UIPopoverArrowDirectionDown: _arrowImageView.transform = CGAffineTransformMakeScale(1, -1); //    () arrowRect = _arrowImageView.frame; //     origin arrowRect.origin.x = self.bounds.size.width / 2 + _arrowOffset - arrowRect.size.width / 2; arrowRect.origin.y = self.bounds.size.height - arrowRect.size.height; break; case UIPopoverArrowDirectionLeft: _arrowImageView.transform = CGAffineTransformMakeRotation(-M_PI_2); //   90     arrowRect = _arrowImageView.frame; //     origin arrowRect.origin.x = 0; arrowRect.origin.y = self.bounds.size.height / 2 + _arrowOffset - arrowRect.size.height / 2; //   -        //       ,      // ,    bgCapInsets.bottom,      //    arrowRect.origin.y = fminf(self.bounds.size.height - arrowRect.size.height - bgCapInsets.bottom, arrowRect.origin.y); //           arrowRect.origin.y = fmaxf(bgCapInsets.top, arrowRect.origin.y); break; case UIPopoverArrowDirectionRight: _arrowImageView.transform = CGAffineTransformMakeRotation(M_PI_2); //   90     arrowRect = _arrowImageView.frame; arrowRect.origin.x = self.bounds.size.width - arrowRect.size.width; arrowRect.origin.y = self.bounds.size.height / 2 + _arrowOffset - arrowRect.size.height / 2; //     UIPopoverArrowDirectionLeft arrowRect.origin.y = fminf(self.bounds.size.height - arrowRect.size.height - bgCapInsets.bottom, arrowRect.origin.y); arrowRect.origin.y = fmaxf(bgCapInsets.top, arrowRect.origin.y); break; default: break; } //       _arrowImageView.frame = arrowRect; } 


рдЫреВ рдордВрддрд░


рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛрдб рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдпрд╣ рдЖрдкрдХреЛ рдкреЙрдкрдУрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдЗрд╕ рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ minuses рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреАрд░ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХрд╕рдХрд░ рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдПрдХ рд▓рд╛рд▓ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╣рд░реЗ рд░рдВрдЧ рдХреА рдЖрдмрд╛рджреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдирд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдФрд░ рдЙрдкрд╡рд░реНрдЧ рдФрд░ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рддрд░реАрдХреЗ рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗред рд╡рд╣реА рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рдЗрдВрдбреЗрдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рд░рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
рдореИрдВрдиреЗ рдмреЛрд▓рдиреЗ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реА рд╣реИрдВ

 @interface MBPopoverBackgroundView : UIPopoverBackgroundView //     + (void)initialize; //  (  ) + (void)cleanup; //    (  ) + (void)setArrowImageName:(NSString *)imageName; //       + (void)setBackgroundImageName:(NSString *)imageName; //      + (void)setBackgroundImageCapInsets:(UIEdgeInsets)capInsets; //      + (void)setContentViewInsets:(UIEdgeInsets)insets; //      @end 


рдмреЗрд╢рдХ, рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рд╣реА рддреАрд░ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдПрдХ рд╣реА рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдпрджрд┐ рдПрдХ рдЖрд╡реЗрджрди рдХреЗ рднреАрддрд░ рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧреЛрдВ рдФрд░ рд░рдВрдЧреЛрдВ рдХреЗ MBPopoverBackgroundView рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рддреЛ рдмрд╕ рдПрдХ рд╣реА MBPopoverBackgroundView , рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдпрд╛ рдХреЙрд▓ рдХрд░реЗрдВ set*** рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдЕрд▓рдЧ рдПрдХ MBPopoverBackgroundView рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рд░ рдмрд╛рд░ MBPopoverBackgroundView рд▓рд┐рдП рдХреЙрд▓ рдХрд░реЗрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд▓рдЪреАрд▓рд╛рдкрди ...

 //   @interface MBPopoverBackgroundViewBlue : MBPopoverBackgroundView @end //    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //  [MBPopoverBackgroundView initialize]; //     [MBPopoverBackgroundView setArrowImageName:@"popover-arrow-red.png"]; [MBPopoverBackgroundView setBackgroundImageName:@"popover-background-red.png"]; [MBPopoverBackgroundView setBackgroundImageCapInsets:UIEdgeInsetsMake(12, 12, 12, 12)]; [MBPopoverBackgroundView setContentViewInsets:UIEdgeInsetsMake(10, 10, 10, 10)]; //     "" [MBPopoverBackgroundViewBlue setArrowImageName:@"popover-callout-dotted-blue.png"]; [MBPopoverBackgroundViewBlue setBackgroundImageName:@"popover-background-blue.png"]; [MBPopoverBackgroundViewBlue setBackgroundImageCapInsets:UIEdgeInsetsMake(15, 15, 15, 15)]; [MBPopoverBackgroundViewBlue setContentViewInsets:UIEdgeInsetsMake(20, 20, 20, 20)]; // *** } //    { UIPopoverController *popoverCtl = ...; popoverCtl.popoverBackgroundViewClass = [MBPopoverBackgroundView class]; //  popoverCtl.popoverBackgroundViewClass = [MBPopoverBackgroundViewBlue class]; //   // *** } 

рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рдгрд╛рдо




MBPopoverBackgroundView рд╕реНрд░реЛрдд рдФрд░ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг github рдкрд░ рд╣реИрдВ ред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдЖрд░рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдлреНрд▓реИрдЧ -fno-objc-arc рдХреЛ рдордд рднреВрд▓рдирд╛ рдпрджрд┐ рдЖрдк ARC рд╕рдХреНрд╖рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдХреЛрдб рдореЗрдВ рд╣реИрдВ рдЬреЛ рдХреБрдЫ -fno-objc-arc , release рдФрд░ dealloc рдХреЙрд▓ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╕реНрдереИрддрд┐рдХ рд╢рдмреНрджрдХреЛрд╢ s_customValuesDic рдХрд┐рддрдиреА рджреЗрд░ рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ s_customValuesDic рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк s_customValuesDic рдирд╣реАрдВ s_customValuesDic рдЬрд╛рдПрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдЖрд░рд╕реА рдХреЗ рддрд░реНрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рддрдм рддрдХ рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБ рдХреЛ рдирд╣реАрдВ s_customValuesDic рдЬрдм рддрдХ рдХрд┐ рдЖрд╡реЗрджрди рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред рдФрд░ рдореБрдЭреЗ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░ рдФрд░ рдордЬрд╝рдмреВрддреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛


Source: https://habr.com/ru/post/In137851/


All Articles