1.å¦ä½å¼åä¸ä¸ª AVPlayer iPad ç¨åº
2.å¦ä½å¦å¥½OBJECTIVEC
3.å端主è¦å¦ä»ä¹ï¼
4.前端,框框架后端,嵌入式?
å¦ä½å¼åä¸ä¸ª AVPlayer iPad ç¨åº
AirPlay 并ä¸æ¯æ°ä¸è¥¿ï¼å®å¨ iOS 4.3 SDK ä¸å°±åå¨äºãä½AirPlay API ä¸ä¸æææ°çä¸è¥¿å å ¥ãå ¶ä¸ä¸ä¸ªæ趣æ°ç¹æ§æ¯ iPad ç¨åºè½éè¿ Apple TV 2 ææ¾æ¥èª iOS 设å¤ä¸çå 容ï¼æè éåiPad 2 ä¸çå±å¹å 容ã
ç®èè¨ä¹ï¼AirPlay å°±æ¯å°åªä½å 容ææ¾å°é«æ¸ æ¾ç¤ºå¨ï¼çµè§ï¼æé«æ¸ é³æç³»ç»ä¸ãApple TV 2 åæ¯ç¨äºè¿æ¥ iOS 设å¤æ iTunesä¸é«æ¸ 设å¤ä¹é´çæ¡¥æ¢ã
éç iOS 5 çåºç°ï¼ä»»ä½ä½¿ç¨ AV Foundation ç±»çç¨åºé½è½ä»ç¨åºä¸ææ¾é³è§é¢å å®¹å° Apple TVãä½ å¯ä»¥ç¨MPMoviewPlayerController éè¿ AirPlay å°å½åæ£å¨ææ¾çå 容æå½±å°é«æ¸ çµè§æå ¶å®é«æ¸ æ¾ç¤ºè®¾å¤ä¸ãå¦ä¸ä¸ªè¿æ¥æ¯ä»UIWebView ææ¾è§é¢ï¼è¿æ¯æ¿å¨äººå¿çæ¹è¿ï¼å 为è¿æå³çæ们å¯ä»¥ç´æ¥ä» web ä¸å°å¨çº¿çé³è§é¢æå½±å°çµè§æè Apple TV 2 ä¸ã
ä½¿ç¨ AVFoundation æå½±è§é¢å 容
è¦å¨åºç¨ç¨åºä¸ä½¿ç¨ AVFoundationï¼éè¦å®ç° AVPlayer 并设置 allowsAirPlayVideo 为 YES 以å¼å¯ AirPlayï¼æè 设置为NO ä»¥å ³é AirPlayï¼å¦ä»¥ä¸ä»£ç æ示ï¼
-(BOOL)setAirPlay:(BOOL)airplayMode{
return self.player.allowsAirPlayVideo=airplayMode;
}
ç¼ååºç¨ç¨åº
为äºæ¼ç¤ºå¦ä½å建 AVPlayer åºç¨ç¨åºä»¥åå®ç° AirPlayï¼æ们å°å建ä¸ä¸ª Single View Application(注æå¾é UseStoryboards)ï¼æ°å»ºä¸ä¸ª AVPlayer 类并å®ç° AirPlay ç¹æ§ã
å建ä¸ä¸ª Single View Applicationãç®æ ç±»åå¯ä»¥éæ© iPhoneãiPod æè iPadãå建项ç®ä¹åï¼åå¯¼å ¥ AV Foundation æ¡æ¶ã
æ¥çå建ä¸ä¸ªæ° classï¼å½å为 Playerï¼å¹¶ç»§æ¿ UIView ç±»ãå¨å¤´æ件ä¸ï¼å å ¥ AVPlayer 类并å¢å ä¸ä¸ª AVPlayer å±æ§ãå¦ä¸å代ç æ示ã
@class AVPlayer;
@interface Player : UIView
@property(nonatomic, strong) AVPlayer * player;
æ¥ä¸æ¥å°±æ¯å®ç° Player ç±»ã
æ们å®ç°äºæåºæ¬ç AVPlayer éè¦å®ç°çæèµ·ç ç 4 个æ¹æ³ï¼åæ¶è¿æä¾äºä¸ä¸ªæ¹æ³ä½ä¸ºæ们ç AirPlay å¼å ³ã
é¦å æ们éè¦ä¸ä¸ª AVLayer ç±»çå è£ ç±»ã该类æ¯ä¸ä¸ª CALayer åç±»ï¼ç¨äºå¯¹åªä½çå¯è§å 容è¿è¡ç®¡çãå建å è£ ç±»ç代ç å¦ä¸ï¼
+ (Class)layerClass {
return [AVPlayerLayer class];
}
ç¶å为éè¦ä¸ä¸ªæ¹æ³ï¼å®ä¾åä¸ä¸ª AVPlayer 对象ï¼æ们å¨å¤´æ件ä¸å®ä¹çï¼ãå¦ä¸å代ç æ示ã
-(AVPlayer *) player{
return [(AVPlayerLayer *)[self layer] player];
}
å¨ setPlayer æ¹æ³ä¸ï¼å¦ä¸å代ç æ示ï¼æä¸ä¸ª AVPlayer åæ°ï¼ç¨äºå°ä¸ä¸ª AVPlayer å®ä¾æ·»å å° UIViewãè¿ä¸ª UIView åç±»ï¼å°ç¨å¨ä¸» View Controller ä¸ã
- (void)setPlayer:(AVPlayer*)player {
[(AVPlayerLayer*)[self layer] setPlayer:player];
}
è¿ä¸ªç±»çæåä¸ä¸ªæ¹æ³æ¯ setAirPlay æ¹æ³ãå ¶åæ°å°ç¨äºæå® AVPlayer UIView (Player)çallowsAirPlayVideo å±æ§ãå¦ä»¥ä¸ä»£ç æ示ã
-(BOOL)setAirPlay:(BOOL)airplayMode{
return self.player.allowsAirPlayVideo=airplayMode;
}
为è§é¢çè¾åºæå®å¾å±(AVPLayerLayerï¼æ¶ï¼å¯ä»¥æå®ä»»ææ°éçå¾å±,åªè¦è½æ¹ä¾¿æ§å¶å 容æ¾ç¤ºãæ¯å¦è¯´å¤çé³é¢åè§é¢ä¹é´çæ¶é´åæ¥ãéè¿setDisplayModeï¼ä½ å¯ä»¥è®¾ç½®ç¨äºæ¾ç¤ºçå¾å±ï¼å å建ä¸ä¸ª AVPlayerLayer 对象ä½ä¸ºæ¾ç¤ºå¾å±ï¼ç¶åä¿®æ¹å®çå±æ§ãé»è®¤æ¯AVLayerVideoGravityResizeAspect å±æ§ï¼å¦å¤ä¹å¯ä»¥è®¾ç½® AVLayerVideoGravityResizeAspectFill å±æ§åAVLayerVideoGravityResize å±æ§ã AVLayerVideoGravityResizeAspect ä¿æè§é¢ç宽é«æ¯å¹¶ä½¿ææ¾å 容èªå¨éåºææ¾çªå£ç大å°ãAVLayerVideoGravityResizeAspectFill ååè 类似ï¼ä½å®æ¯ä»¥ææ¾å 容填å èä¸æ¯éåºææ¾çªå£ç大å°ãæåä¸ä¸ªå¼ä¼æ伸ææ¾å 容以éåºææ¾çªå£ã
Player ç±»çå®æ´ä»£ç å¦ä¸ï¼
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@class AVPlayer;
@interface Player : UIView
@property(nonatomic, strong) AVPlayer * player;
-(BOOL) setAirPlay:(BOOL) airplayMode;
@end
#import "Player.h"
#import <AVFoundation/AVFoundation.h>
@implementation Player
+ (Class)layerClass {
return [AVPlayerLayer class];
}
-(AVPlayer *) player{
return [(AVPlayerLayer *)[self layer] player];
}
- (void)setPlayer:(AVPlayer*)player {
[(AVPlayerLayer*)[self layer] setPlayer:player];
}
//Enable or disable AirPlay mode
-(BOOL)setAirPlay:(BOOL)airplayMode{
return self.player.allowsAirPlayVideo=airplayMode;
}
@end
å¨ç¨åºä¸ä½¿ç¨ Player ï¼UIViewåç±»ï¼
ä¸è¿°ä»£ç å æ¬äºPlayer ï¼AVPlayer ç UIView åç±»ï¼ç.hæ件å.m æ件ã
è¦å¨ä¸ä¸ª UIViewController ä¸ä½¿ç¨è¿ä¸ª AVPlayer è§å¾ï¼æå¼ Xcode çæ äºæ¿(storyboard,åææ¯å建项ç®æ¶ä½¿ç¨äºâuseStoryboardâé项ï¼ãéä¸UIView(ä¸æ¯ UIViewControllerï¼å¹¶å°å®ç类修æ¹ä¸º Playerãä½ å¯ä»¥å¨ Identity é¢æ¿ç customeclass å段è¾å ¥ï¼ä¹å¯ä»¥ä»å®çä¸æå表ä¸éæ©ã
æå¼ Assistant Editor ,为 UIView åç±» Player å建ä¸ä¸ª IBOutlet,ä» view ç¨å³é®æå°å³è¾¹ç头æ件ä¸å³å¯ãå¦ä¸å¾æ示ã
å建IBActions å IBOutlets è¿æ¥
å建ä¸ä¸ªå§æå° klViewController ãå¨ Player ä¸å³é®ï¼ä» IBOutlet æä¸ä¸ªè¿æ¥çº¿å° klViewController (dock ä¸çé»è²æ¹å) ï¼å¦ä¸å¾æ示ã
æ·»å å§æè¿æ¥ klViewController
å¨æ äºçä¸ï¼å ä¸ä¸ª Toolbar ãå¨ Toolbar æ¯å å ¥ä¸¤ä¸ªæé®ï¼åå«å°æ ç¾ææ¬è®¾ç½®ä¸º Play å Pauseãç¶åå ä¸ä¸ª Switchï¼ç¨äºåæ¢AirPlay å¼å ³ç¶æãä¸ºè¿ 3 个æ§ä»¶å建ç¸åºç IBActionï¼å¯ä»¥ç¨ Assistant Editorï¼ãå©ä¸çäºæ å¨ klViewController ç±»ä¸è¿è¡ã
æå¼ klViewController.h æ件ï¼å å ¥ @class Player å @class AVPlayer è¯å¥å¹¶å¯¼å ¥ AVFoundation æ¡æ¶å Player.hãæºä»£ç è§ä¸ï¼
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import "Player.h"
@class Player;
@class AVPlayer;
@interface klViewController : UIViewController
声æä¸ä¸ª AVPlayer å±æ§ï¼ç¨äºå è½½å° Palyer è§å¾ä¸ã
声æä¸ä¸ª NSURL å±æ§ãç¶åæ¯ Switch æ§ä»¶ç IBOutletï¼ç¨ Assistant Editorå建ï¼ã
kvLiewController.h æ件代ç å¦ä¸ï¼
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import Player.h
@class Player;
@class AVPlayer;
@interface klViewController : UIViewController
@property(nonatomic, strong) AVPlayer * myPlayer;
@property(nonatomic, strong) NSURL * avContentUrl;
@property (strong, nonatomic) IBOutlet Player *airPlayView;
@property (nonatomic, retain) IBOutlet UISwitch * AirPlaySwitch;
- (IBAction)PlayVideo:(id)sender;
- (IBAction)PauseVideo:(id)sender;
- (IBAction)isAirPlayOn:(id)sender;
@end
æ¥ä¸æ¥æ¯ç±»çå®ç°æ件ãå¨ viewDidLoad æ¹æ³ä¸ï¼ç¨ä¸ä¸ªè§é¢æ件ç URL å°ååå§å avContentUrlï¼
avContentUrl = [[NSURL alloc] initWithString
ç¶åç¨ avContentUrl åå§åä¸ä¸ª AVPlayer ï¼ç¨äºç»å¤´æ件ä¸å®ä¹ç myPlayer å±æ§èµå¼ãå° myPlayer èµç» airPlayView ç player å±æ§ï¼airPlayerView æ¯ä¸ä¸ª Player 对象ãå¦ä¸å代ç æ示ï¼
self.myPlayer = [AVPlayer playerWithURL:avContentUrl];
[airPlayView setPlayer:[self myPlayer]];
ç°å¨ï¼è¦å®ç°ä¸¤ä¸ªæé®çè§é¢ææ¾åæååè½ï¼ä»¥å Switch æ§ä»¶ç AirPlay å¼å ³åè½ãææ¾æé®ç action æ¹æ³ä»£ç å¦ä¸æ示ï¼
- (IBAction)PlayVideo:(id)sender {
[self.myPlayer play];
}
æåæé®ç action æ¹æ³ä»£ç å¦ä¸æ示ï¼
- (IBAction)PauseVideo:(id)sender {
[self.myPlayer pause];
}
Switch æ§ä»¶ç action æ¹æ³ä»£ç å¦ä¸æ示ï¼
- (IBAction)isAirPlayOn:(id)sender {
AirPlaySwitch = (UISwitch *) sender;
if (AirPlaySwitch.on) {
[airPlayView setAirPlay:NO];
}else
{
[airPlayView setAirPlay:YES];
}
}
ç»å°¾
å¦ä¸ä¸ªä¸ AirPlay æå ³çå±æ§æ¯ usesAirPlayVideoWhileAirPlayScreenIsActive ï¼å®ç¨äºèªå¨å¨å¨ææ¾æé´å° AVPlayer åæ¢å° AirPlay,å½ç¶ä» ä» æ¯å¨ AirPlay å·²å¼å¯çæ åµä¸ãé»è®¤æ¯ false çã
è¦è¿è¡æ¬ç¤ºä¾ç¨åºï¼éè¦å¨ iPad ä¸è¿è¡ï¼å¹¶å° iPad è¿æ¥è³ Apple TV åä¸ wifi ç½ç»ï¼ç¶åè§é¢èµæºç URL å¿ é¡»æ¯ææçãå¨æ¨¡æå¨ä¸AirPlay æ¯æ æçã
klViewController.h æ件
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import "Player.h"
@class Player;
@class AVPlayer;
@interface klViewController : UIViewController
@property(nonatomic, strong) AVPlayer * myPlayer;
@property(nonatomic, strong) NSURL * avContentUrl;
@property (strong, nonatomic) IBOutlet Player *airPlayView;
@property (nonatomic, retain) IBOutlet UISwitch * AirPlaySwitch;
- (IBAction)PlayVideo:(id)sender;
- (IBAction)PauseVideo:(id)sender;
- (IBAction)isAirPlayOn:(id)sender;
@end
klViewController.m æ件
#import "klViewController.h"
@implementation klViewController
@synthesize airPlayView;
@synthesize avContentUrl, myPlayer, AirPlaySwitch;
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
//This is an Apple sample video
avContentUrl = [[NSURL alloc] initWithString:@" self.myPlayer = [AVPlayer playerWithURL:avContentUrl];
[airPlayView setPlayer:[self myPlayer]];
[self.myPlayer play];
}
- (void)viewDidUnload
{
[self setAirPlayView:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
- (IBAction)PlayVideo:(id)sender {
[self.myPlayer play];
}
- (IBAction)PauseVideo:(id)sender {
[self.myPlayer pause];
}
- (IBAction)isAirPlayOn:(id)sender {
AirPlaySwitch = (UISwitch *) sender;
if (AirPlaySwitch.on) {
[airPlayView setAirPlay:NO];
}else
{
[airPlayView setAirPlay:YES];
}
}
@end
å¦ä½å¦å¥½OBJECTIVEC
1.请å æCè¯è¨åºç¡å¦å¥½ï¼
2.çãProgramming in Objective-C 2.0ãï¼ä¸è¦çãObjective-C 2.0ç¨åºè®¾è®¡ãï¼
3.çãCocoa Design PatternsãåãCocoa Programming Developer's Handbookã,ä¸è¦å 为ä»ä»¬å¾é¾èæ们èªå·±æ¯åå¦è æ以就ä¸çï¼
4.æ¯çï¼ä½ éè¦ä¸å°Macï¼å¦æä½ ççæç®å¥½å¥½å¦Objective-CåCocoaçè¯ï¼
5.ä¸è¦æ¾è¿ä»»ä½ä¸ä¸ªçä¸å»å¾ç®åçå°ç¼ç¨é®é¢ââä»ä»¬å¾å¾å¹¶ä¸é£ä¹ç®åï¼æè å¯ä»¥å¼ä¼¸åºå¾å¤ç¥è¯ç¹ï¼
6.ä¼ç¨Objective-Cï¼å¹¶ä¸è¯´æä½ ä¼Cocoaç¼ç¨ï¼
7.å¦è¯æ³å¹¶ä¸é¾ï¼Foundationï¼Appkitï¼UIKitï¼Core Dataï¼Core Animationä¹ä¸è¿å¦æ¤ââé¾çæ¯é¿æåæå®è·µåä¸éä½åçæ¥é ææ¡£ï¼
8.请æ¶å»è®°ä½ï¼è¦ååºå¥½çAppï¼çé¢è®¾è®¡åç¨åºåè½åçéè¦ââå ¶å®å¯ä»¥æ¶å»è®°ä½ï¼Mac/iOSç¨æ·çé¢è§çº¦ä¹æ¯å¿ 读çææ¡£ï¼
9.ä¸çCè¯è¨ç书ï¼æ¯å¦ä¸å¥½Objective-Cè¯è¨çï¼
.æµ®èºç人容æ说ï¼XXè¯è¨ä¸è¡äºï¼åºè¯¥å¦YYï¼ââæ¯ä½ èªå·±ä¸è¡äºå§ï¼ï¼
.æµ®èºç人容æé®ï¼æå°åºè¯¥å¦ä»ä¹ï¼ââå«é®ï¼å¦å°±å¯¹äºï¼
.æµ®èºç人容æé®ï¼XXæé±éåï¼ââå»ºè®®ä½ å»æ¢é¶è¡ï¼
.æµ®èºç人容æ说ï¼æè¦ä¸æçï¼æè±æä¸è¡ï¼ââä¸è¡ï¼å¦åï¼
.æµ®èºç人容æé®ï¼XXåYYåªä¸ªå¥½ï¼ââåè¯ä½ å§ï¼é½å¥½ââåªè¦ä½ å¦å°±è¡ï¼
.æµ®èºç人å两ç§ï¼a)åªè§æèä¸å¦ç人ï¼b)åªå¦èä¸åæç人ï¼
.Cocoaæ¯Objective-Cçæ¡æ¶ï¼ä¸»è¦å æ¬Foundationï¼AppkitåCore DataãCocoa Touchæ¯CocoaçiOSçæ¬ï¼ä¸»è¦å æ¬Foundationï¼UIKitåCore Dataï¼
.Objective-Cä¸ä» ä» æ¯ä¸ºCå äºä¸ªç±»ââè¿è¡æ¶ç¯å¢åæ ·è³å ³éè¦ï¼
.å¦ä¹ ç¼ç¨æ好çæ¹æ³ä¹ä¸å°±æ¯é 读ææ¡£åæºä»£ç ï¼è¯·åç¨Xcodeææ¡£éçç¨åºå®ä¾æºä»£ç ï¼
.请记ä½ï¼Objective-Cæ¯âå¨æâçè¯è¨ï¼
.请é 读ãObjective-C 2.0 Programming Languageãçææ¡£ââå®æ¹çææ¡£æ»æ¯ææå¨ï¼æå®æ´çåè书ï¼
.çå¾æç书ï¼è¯·ä»ç»çï¼çä¸æç书ï¼è¯·ç¡¬ç头ç®çï¼
.å«ææç第ä¸é书就è½è®°ä½åææ¡ä»ä¹ââ请ç第äºéã第ä¸éï¼
.请记ä½ï¼iOSåMacå¼åæ¬è´¨ä¸æ¯ç¸åçï¼ä¸è¿åºå«ä¹åæ ·è¦è¢«éè§ï¼
.ä¸è¦åçå¨Xcodeçå±é¢ä¸ãææ¡éè¿å½ä»¤è¡ä½¿ç¨gccågdbï¼ä»¥ågitçå·¥å ·ï¼å°ä½¿ä½ æçåå¢ï¼
.åå«äººä¸èµ·è®¨è®ºææä¹çObjective-CåCocoaç¥è¯ç¹ï¼èä¸æ¯äºåµCocoaè¡ä¸è¡æè Objective-Cä¸C++åªä¸ªå¥½ï¼
.ä¸è¦è¢«åç§Core XXXçâææ¯âåè¯æè¿·æï¼å®ä»¬åªä¸è¿æ¯CåObjective-Cçæ¡æ¶(åº)èå·²ï¼
.å¦æä½ å¦è¿C++ï¼è¯·ææ¶å¿è®°ä½¿ç¨.(ç¹)è°ç¨æ¹æ³ï¼Objective-Cæ¯ç¨æ¹æ¬å·çï¼å¹¶ä¸æ´åç¡®çååå«åâæ¶æ¯ä¼ éâï¼
.Objective-Cæ¯Cè¯è¨çä¸¥æ ¼è¶ éï¼åCè¯è¨è系紧å¯ï¼Cè¯è¨æ¯Objective-Cçä¸é¨åï¼
.请ä¸è¦è®¤ä¸ºå¦è¿C++è¯è¨åæ¹å¦Objective-C就没æä»ä¹é®é¢ââä½ åªä¸è¿åå¨å¦ä¸é¨å ¨æ°çè¯è¨èå·²ï¼
.读å®äºãCocoa Programming Developer's Handbookã以ååæ¥è®¤å®èªå·±æ¯ä¸æ¯å·²ç»å¦ä¼äºObjective-Cï¼
.å¦ä¹ ç¼ç¨çç§è¯æ¯ï¼ç¼ç¨ï¼ç¼ç¨ï¼åç¼ç¨ï¼
.请çæä¸å书ç±ï¼ãCocoa Programming Developer's HandbookããCocoa Design PatternããiOS 4 Advaced ProgrammingããCocoa Programming A Quick-Start Guide for Developersãï¼
.ä¸è¦å 为è¹ææ¯ä¸ªåä¸å ¬å¸ï¼ä½ å°±å¯ä»¥å¿è®°å¼æºãäºä¸ªäººæ¥è¯´ï¼å¼æºæ¯ç»äºï¼ä½ä½ å´è·å¾äºæ´å¤ãå«å¿äºï¼è¹æèªå·±ä¹ä½¿ç¨äºå¤§éå¼æºææ¯ï¼
.请æ书ä¸çç¨åºä¾å亲æè¾å ¥å°çµèä¸å®è·µï¼å³ä½¿é å¥å çä¸ææºä»£ç ï¼
.空é²çæ¶åå¯ä»¥æèªå·±çæ³æ³åæ代ç ï¼å¹¶æ¾å°githubä¸å»ï¼ææå®åæApp Storeéçä¸ä¸ªè½¯ä»¶ï¼
.请éè§Objective-Cçè¿è¡æ¶ç¯å¢ç¼ç¨ï¼å¹¶å°å ¶åå®çè¿ç¨å°èªå·±çç¨åºä¸ï¼
.ç»å¸¸å顾èªå·±ä»¥ååè¿çç¨åºï¼å¹¶å°è¯éåï¼æèªå·±å¦å°çæ°ç¥è¯è¿ç¨è¿å»ï¼
.ä¸è¦æ¼æ书ä¸ä»»ä½ä¸ä¸ªç»ä¹ é¢ââè¯·å ¨é¨åå®å¹¶è®°å½ä¸è§£é¢æè·¯ï¼
.Objective-Cï¼CocoaåXcodeéæå¼åç¯å¢è¦åæ¶å¦ä¹ åææ¡ï¼
.æ¢ç¶å³å®äºå¦Objective-C,就请åæå¦ä¸å»ï¼å 为å¦ä¹ ç¨åºè®¾è®¡è¯è¨çç®çæ¯ææ¡ç¨åºè®¾è®¡ææ¯ï¼èç¨åºè®¾è®¡ææ¯æ¯è·¨è¯è¨çï¼
.工欲åå ¶äºï¼å¿ å å©å ¶å¨ï¼è¦å好Objective-CåCocoaå¼åï¼è¯·ç¨å¥½Xcodeï¼
.å½ä½ åCocoaç¨åºåå°ä¸åå´åç°èªå·±ç¨çæ¹æ³å¾æå£æ¶ï¼è¯·ä¸è¦é©¬ä¸åæï¼è¯·å°½å¿«å°ä½ä¸çé¨åç²ç¥çå®æ以ä¿è¯è¿ä¸ªè®¾è®¡çå®æ´æ§ï¼ç¶ååæèªå·±çé误并éæ°è®¾è®¡åç¼åï¼åè§ï¼ï¼
.å«å¿æ¥ï¼è®¾è®¡Objective-Cç类确å®ä¸å®¹æï¼èªå·±ç¨åºä¸çç±»åèªå·±ç类设计水平æ¯å¨ä¸æçç¼ç¨å®è·µä¸å®åååå±çï¼
.å³ä¸è¦å 为ç¨åºâå¾å°âå°±ä¸éµå¾ªæäºä½ ä¸çç»çè§åââå¥½ä¹ æ¯æ¯å¹å »åºæ¥çï¼èä¸æ¯ä¸æ¬¡è®°ä½çï¼
.æ¯å¦å°ä¸ä¸ªObjective-Cçé¾ç¹çæ¶åï¼å°è¯ç对å«äººè®²è§£è¿ä¸ªç¥è¯ç¹å¹¶è®©ä»ç解ââä½ è½è®²æ¸ æ¥æ说æä½ ççç解äºï¼
.è®°å½ä¸å¨åå«äººäº¤æµæ¶åç°çèªå·±å¿½è§æä¸ç解çç¥è¯ç¹ï¼
.请ä¸æå°å¯¹èªå·±åçç¨åºæåºæ´é«çè¦æ±,åªæä½ çç¨åºçæ¬å·ä¼åæVersion .XXï¼
.ä¿åå¥½ä½ åè¿çææçç¨åºââgithubæ¯ä½ æä½³ç代ç æç®¡å·¥å ·ï¼
.请ä¸è¦åæµ®èºç人ï¼
.请çç±Objective-Cï¼
å端主è¦å¦ä»ä¹ï¼
å端æ¡æ¶
å¦å¥½Webæ¡æ¶ï¼çæææ¡HTMLãæå¡å¨ç«¯èæ¬è¯è¨ãCSSåJavaScriptä¹åï¼å¦ä¹ Webæ¡æ¶å¯ä»¥å å¿«Webå¼åé度ï¼è约æ¶é´ãPHPç¨åºåå¯éçæ¡æ¶å æ¬CakePHPãCodeIgniterãZendçï¼Pythonç¨åºåå欢使ç¨Djangoå webpyï¼Rubyç¨åºå常ç¨RoRã
éçWeb è¶æ¥è¶è§èåæ åçç»ä¸ï¼Webç»ä»¶åææ¯ä¸æé©æ°ï¼ç§»å¨ç«¯å¼åä¸æååï¼ä»¥ä¸æ¯ä¸äºå¸¸è§å¼æºå端æ¡æ¶:
Bootstrap
主æµæ¡æ¶ä¹ä¸ï¼Bootstrap æ¯åºäº HTMLãCSSãJavaScriptçï¼å®ç®æ´çµæ´»ï¼ä½¿å¾ Web å¼åæ´å å¿«æ·ã
html5-boilerplate
该æ¡æ¶å¯ä»¥å¿«éæ建å¥å£®ï¼ä¸éåºå强çweb appæç½ç«ã
Meteor
Meteoræ¯æ°ä¸ä»£çå¼åå³æ¶webåºç¨çå¼æºæ¡æ¶ï¼å®è½å¨è¾çæ¶é´å å®æå¼åã
Semantic UI
åºäºèªç¶è¯è¨ææååçUIç»ä»¶æ¡æ¶
Foundation
ä¼ç§çååºå¼å端æ¡æ¶
Materialize
åºäºææ设计çç°ä»£åååºå¼å端æ¡æ¶ãå¯æä¾é»è®¤çæ ·å¼ï¼èªå®ä¹ç»ä»¶ãæ¤å¤ï¼Materializeè¿æ¹è¿å¨ç»åè¿æ¸¡ï¼ä¸ºå¼å人åæä¾æµç çä½éªã
Pure
å ä¹å¯ä»¥å¨æ¯ä¸ä¸ªweb项ç®ä¸ä½¿ç¨çä¸ç»å°çåååºå¼çCSS模åã
Vue
Vue.js æ¯ç¨äºæ建交äºå¼ç Web çé¢çåºãå®æä¾äº MVVM æ°æ®ç»å®åä¸ä¸ªå¯ç»åçç»ä»¶ç³»ç»ï¼å ·æç®åãçµæ´»ç APIã
Skeleton
Skeleton æ¯ä¸ä¸ªå°ç JS å CSS æ件çéå,å¯å¿«éå¼åæ¼äº®çç½ç«,éååç§å±å¹è®¾å¤å æ¬ææºãSkeleton åºäº grid å¼åãå®æ¯ä¸ä¸ª UI æ¡æ¶ã
Amaze UI
å½å é¦ä¸ªå¼æºHTML5è·¨å±å端æ¡æ¶äº§åç³»åï¼ä¸ææçæ¯ææ´ä¼ãæ¬ååç»ä»¶ä¸°å¯ã该产åç³»åä¸æä¸é¨é对移å¨ç«¯çHTML5æ··ååºç¨å¼åæ¡æ¶Amaze UI Touch以åé对跨å±HTML5ç½é¡µå¼åçAmaze UI Webãå ¶ä¸ï¼Amaze UI Touchå¯ä»¥å¸®å©å¼åè éè¿ä¸°å¯çç»ä»¶ï¼å¿«éæ建åºä¸åçAPPç¸åª²ç¾çä¸å±ç§»å¨ç«¯çHTML5åºç¨ã
UIkit
ä¸ä¸ªè½»é级çå模ååçå端æ¡æ¶,ç¨äºå¿«éå¼åååè½å¼ºå¤§çwebæ¥å£ã
Yui
Yahoo! UI Library (YUI) æ¯ä¸ä¸ªå¼æ¾æºä»£ç ç JavaScript å½æ°åºï¼ä¸ºäºè½å»ºç«ä¸ä¸ªé«äºå¨çç½é¡µï¼å®éç¨äºAJAX, DHTML å DOM çç¨å¼ç ææ¯ãå®ä¹å å«äºè®¸å¤ CSS èµæºã使ç¨ææ为 BSD许å¯è¯ã
kissy
ä¸æ¬¾è·¨ç»ç«¯ã模ååãé«æ§è½ã使ç¨ç®åç JavaScript æ¡æ¶ã
MUI
ææ¥è¿åçAppä½éªçå端æ¡æ¶çæ¡æ¶ã
Arale
ä¸ä¸ªå¼æ¾ãç®åãæç¨çå端åºç¡ç±»åºã
JX
JX æ¯æ¨¡ååçéä¾µå ¥å¼Webå端æ¡æ¶ï¼ç¹å«éåæ建åç»ç»å¤§è§æ¨¡ãå·¥ä¸çº§çWeb Appã
GMU
GMUæ¯åºäºzeptoçmobile UIç»ä»¶åºï¼æä¾webappãpad端ç®åæç¨çUIç»ä»¶! Web Appã
ZUI
å¼æºHTML5å端æ¡æ¶
Clouda Touch.js
Touch.jsæ¯ç§»å¨è®¾å¤ä¸çæå¿è¯å«ä¸äºä»¶åº,ä¹æ¯å¨ç¾åº¦å é¨å¹¿æ³ä½¿ç¨çå¼åã
前端,后端,嵌入式?
硬件前端开发和硬件后端开发哪个工资高嵌入式开发和硬件前端开发是一回事吗?
嵌入式开发分硬件和软件开发,其中硬件和软件里面还要细分,架源教程很多岗位和领域。框框架说到哪个工资高,架源教程不好说,框框架这和不同地域,架源教程windows 10源码 下载不同岗位和不同水平有关系,框框架所以不能一概而论。架源教程建议无论做到哪个领域,框框架先学好再说,架源教程不要太在乎工资。框框架
软件开发,架源教程前端开发,框框架和后端开发,架源教程哪个更累,框框架哪个更挣钱,谢谢指点
首先,软件开发几乎包括了一切,不仅包括前端后端还包括嵌入式都是软件开发。
前端开发跟后端开发,都很累,全看个人。
前端目前更赚钱,因为前端正在蚕食其他桌面领域的份额,因为前端现在任何界面都可以跑(Linux、Win、Mac、Andriod、iPhone),这些领域的价值正在被转移到前端(特指网页前端),也就是说目前前端是能做事情最多的,至少是看上去。
往高级技术讲,后端会比前端要难,也要更累,工资也更高。
所以,理论上,初级程序员前端工资高,高级程序员后端工资高。android启动图源码
但是,实际上,初级才会分前后,高级程序员啥都要。
学java出来后,做前端还是后端好?从技术本身来说,java本身会偏向后端一些;如果你对前端感兴趣的话,像node.js、bootstrap、vue.js等等前端框架看下自己有没有掌握,现在不是懂点Html+css或者能写点ajax就可以做前端了。当然,做前端的话,除此以外,对网站的配色、页面的布局,包括一些审美等等还是有点小要求的,如果你能达到的话,你可以尝试去做前端。
就目前来说,随着前后端分离,前端和后端的薪资待遇这块儿都差不多了。选择前端还是后端很多时候看个人意愿吧,或者是觉得自己前端强点儿还是后端强点儿!不过,从个人建议上来说还是后端会更好些,因为前端相对来说比较简单,做了一段时间的后端还可以转去做前端。另外的话,就是很多时候几个项目可以用同一套前端框架,需要的话改改就好,除非对前端要求较高,一个项目一套前端,一般像这种情况还是比较少的。
学编程能做什么工作?看你学哪方面的,学编程可以做前端开发,后端开发,嵌入式开发,还有运维等工作,vivi源码是什么做前端要学html、css、js和ps,后端的话还要多学一门后端语言java、python等,运维学linux、shell等。
网页设计前端和后端的区别?越详细越好。详细的解释一下web前后端的区别
1、
前台:呈现给用户的视觉和基本的操作。
后台:用户浏览网页时,我们看不见的后台数据跑动。后台包括前端、后端。
前端:对应我们写的html、css、javascript等网页语言作用在前端网页。
后端:对应jsp、javaBean、dao层、action层和service层的业务逻辑代码。(包括数据库)
为什么jsp是后端呢?主要是jsp的运行原理是在tomcat服务器运行的。
2、
(1)javaweb是java开发中的一个方向java有搞安卓的,搞web的,搞嵌入式的等。javaweb就是指搞web方向的,javaweb分两块,一块是服务器端叫后端,另一块叫前端,也就是web前端。前端就是用户能看到的部分,比如淘宝网,qq空间,网页上你能看到的都是web前端做的。后端做的就是为前端的展示业务逻辑功能做处理。
(2)javaweb包括了jsp,servelt以及一些框架比如spring,structs以及与数据库交互的散步啦导购源码知识,当然也涉及到了html,css等前端技术,但是更侧重于后端的开发。web前端主要是html,css,javascript之类的技术。
jaweb是javaee的一个方向,Javaweb,由前端、Java代码、和数据库三个大方面组成,前端只是其中之一。
(3)在我们的机子上看到的界面,安装的程序,给用户看的,操作的就是前端;而你看不到的,帮你保存网络游戏数据,保存应用数据,处理数据的就是后端(服务器)。比如说:我们在用的知乎就是前端,而保存这个问题,还有把这个问题推送给你的就是后端。
二、定义不同
一般来说,我们将网站分为前端和后端。前端主要负责页面的展示,后端则是业务逻辑的实现。
1、Web前端:
顾名思义是来做Web的前端的。这里所说的前端泛指Web前端,也就是在Web应用中用户可以看得见碰得着的东西。包括Web页面的结构、Web的外观视觉表现以及Web层面的交互实现。
2、Web后端:
后端更多的是与数据库进行交互以处理相应的业务逻辑。需要考虑的是如何实现功能、数据的存取、平台的稳定性与性能等。
三、jquery源码事件委托需要掌握的技术不同
1、Web前端:
精通JS,能熟练应用JQuery,懂CSS,能熟练运用这些知识,进行交互效果的开发。
(1)精通HTML,能够书写语义合理,结构清晰,易维护的HTML结构;
(2)精通CSS,能够还原视觉设计,并兼容业界承认的主流浏览器;
(3)熟悉JavaScript,了解ECMAScript基础内容,掌握1-2种js框架,如JQuery;
(4)对常见的浏览器兼容问题有清晰的理解,并有可靠的解决方案;
(5)对性能有一定的要求,了解yahoo的性能优化建议,并可以在项目中有效实施。
2、Web后端:
后端开发人员:会写Java代码,会写SQL语句,能做简单的数据库设计,会Spring和iBatis,懂一些设计模式等。
(1)精通jsp,servlet,javabean,JMS,EJB,Jdbc,Flex开发,或者对相关的工具、类库以及框架非常熟悉,如Velocity,Spring,Hibernate,iBatis,OSGI等,对Web开发的模式有较深的理解;
(2)练使用oracle、sqlserver、mysql等常用的数据库系统,对数据库有较强的设计能力;
(3)熟悉maven项目配置管理工具,熟悉tomcat、jboss等应用服务器,同时对在高并发处理情况下的负载调优有相关经验者优先考虑;
(4)精通面向对象分析和设计技术,包括设计模式、UML建模等;
(5)熟悉网络编程,具有设计和开发对外API接口经验和能力,同时具备跨平台的API规范设计以及API高效调用设计能力。
四、web后端和前端是怎么连接的?
1、web服务器(apache、tomcat等),网络协议(或者php等都可能,但javaweb可以确定后端就是java,web前端其实都一样。
前端和Javaweb的区别更多的在于一个主要负责前端的设计和效果,而Javaweb更专注于后端的内容。
3、刚开始从事web开发时,首先要选准学习方向,看是想从事前端部分还是后端程序部分。当然在工作的后期,就不会分的那么细致了。做前端到后期也会懂一些后端的技术,反之,后端也是。
六、学习Web前端开发都需要掌握哪些技能?
1、学习html。这个是最简单的,也是最基础的.要熟练掌握div、formtable、ulli、p、span、font这些标签,这些都是最常用的,特别是div和table,div用于布局、table也可以用于布局,但是不灵活,基本table是用来和数据打交道。
2、学习css。这里说的css不包括css3,一般我们看到web前端开发工程师的要求里面,有一个会使用css+html或者css+div来进行界面布局,所以css是用于辅助html来布局和展示的,我们称之为“css样式”,为什么会说css+div呢?因为我上面说了div就是html主要用于布局的东西,所以div就是核心掌握的东西!那么css肯定必须要配合div来使用才好.css要熟练掌握float、position、width、height,以及对于的最大最小、会使用百分百、overflow、margin、padding等等,这些都是跟布局有关系的样式,一点要掌握。
3、学习js。可能前两个大家觉得还过的去,看到js就傻眼了,其实吧,js入门很简单的,不需要会很多东西的,只要会根据某个id、或者name拿到网页dom或者样式、或者值,然后会给某个id或者name的元素标签赋值、或者追加数据、追html,这个是跟数据有关系的操作,然后数据逻辑判断,效果方面的,无非就是跳转、弹框、隐藏什么的,把这些全部结合其他就是实际用途了,代码一点都不难,会了这些基础js,其他的直接百度就好了.然后看多了,用多了,就什么都不是问题了。
4、学习jquery。jquery是相当于把js封装了一套的一个js插件,目的就是操作起来更方便,代码写的更少,jquery入门也很简单,那些是入门需要学的和js一样,只是换成了jq的代码.其他的一样百度就够了。
5、最好会点后台语言,比如java、php,为什么呢?因为前台界面的数据都是从后台来的,如果会点后台代码,就知道怎么跟后台交互数据是最好的,这样节约时间,也可以让前端代码更规范.不然可能因为你的写法和后端给来的数据不能结合上,那么前端代码又得重新写,那就更加麻烦了。
6、学习css3+html5,可能这个对于更接手的新人来说有点困难,需要较强的代码知识与经验,但是如果你们是准备专门搞前端,那么最好还是学一下,这样对于将来的工作会有更大的帮助。
七、从事Java后端开发都需要掌握哪些技能?
对于初学Java并且有志于后端开发的同学来说,需要重点关注以下几个部分:
1、基础:比如计算机系统、算法、编译原理等等
2、Web开发:主要是Web开发相关的内容,包括HTML/CSS/js(前端页面)、Servlet/JSP(J2EE)以及MySQL(数据库)相关的知识。它们的学习顺序应该是从前到后,因此最先学习的应该是HTML/CSS/JS(前端页面)。还有一些前段框架比如easyui,还有js,jquery等技术。
3、J2EE:你需要学习的是Servlet/JSP(J2EE)部分,这部分是Java后端开发必须非常精通的部分,因此这部分是这三部分中最需要花精力的。关于Servlet/Jsp部分视频的选择,业界比较认可马士兵的视频。4、数据库:你需要学会使用数据库,mysql是个不错的入门选择,而且Java领域里主流的关系型数据库就是mysql。这部分一般在你学习Servlet/Jsp的时候,就会接触到的,其中的JDBC部分就是数据库相关的部分。你不仅要学会使用JDBC操作数据库,还要学会使用数据库客户端工具,比如navicat,sqlyog,二选一即可。
5、开发框架:目前比较主流的是SSM框架,即spring、springmvc、mybatis。你需要学会这三个框架的搭建,并用它们做出一个简单的增删改查的Web项目。你可以不理解那些配置都是什么含义,以及为什么要这么做,这些留着后面你去了解。但你一定要可以快速的利用它们三个搭建出一个Web框架,你在搭建SSM的过程中,可能会经常接触到一个叫maven的工具。这个工具也是你以后工作当中几乎是必须要使用的工具,所以你在搭建SSM的过程中,也可以顺便了解一下maven的知识。在你目前这个阶段,你只需要在网络上了解一下maven基本的使用方法即可,一些高端的用法随着你工作经验的增加,会逐渐接触到的。
6、你需要去看一些JDK中的类的源码,也包括你所使用的框架的源码。这些源码能看懂的前提是,你必须对设计模式非常了解。否则的话,你看源码的过程中,永远会有这样那样的疑问,这段代码为什么要这么写?为什么要定义这个接口,它看起来好像很多余?由此也可以看出,这些学习的过程是环环相扣的,如果你任何一个阶段拉下来了,那么你就真的跟不上了,或者说是一步慢步步慢。总而言之,这个阶段,你需要做的是深入了解Java底层和Java类库(比如并发那本书就是Java并发包java.concurrent的内容),也就是JVM和JDK的相关内容。而且还要更深入的去了解你所使用的框架,方式比较推荐看源码或者看官方文档。
希望对您有所帮助!~
年,前端,移动开发,后端,我该选哪个?请先给出明确答复:推荐选前端开发,web前端可以说前途不可限量!
解释原因:
现在的Web前端技术可以说是越来越成熟了,Web前端市场也非常的火爆,Web前端人才也是异常的紧缺。再者,由于互联网的崛起,Web前端技术的不断发展,也占据了互联网的一席之地。
那为什么说Web前端无可限量呢?国外著名的自媒体平台facebook,相信大家多多少少知道一点,也用过一点,它就是Web前端技术的产物,完全基于前端框架打造出来的平台。再者,大家常用的外卖平台饿了么,它旗下的部分产品就是基于Web前端技术的。像淘宝,百度,阿里等等,都已经将Web前端技术打入到了自己的产品中。
前端开发行业薪资水平呈上涨趋势,Web前端开发早已不是做带动画的下拉菜单的时代了,他们已成为互联网主宰者,各行业都用其开发互联网应用。但目前整互联网行业的Web前端开发工程师紧俏,企业正高薪求才,薪资待遇一涨再涨!
Web前端技术可以说是越来越成熟了,Web前端市场也非常的火爆,Web前端人才也是异常的紧缺。再者,Web前端行业也是无可限量。由于互联网的崛起,Web前端技术的不断发展,也占据了互联网的一席之地。
Web前端开发工程师已经成为发展中的职业香馍馍。几乎整个互联网行业都缺Web前端工程师,无论是刚起步的创业公司,还是上市公司乃至巨头,空缺一样存在。优秀的Web前端工程师简直比大熊猫还稀少。
有无解决办法:所以,还是很推荐你学习web前端的;如果真的想学习,可以了解一下北京尚学堂,我们是专门做编程培训的,拥有极其丰厚的师资力量,带给你不一样的学习体验。分享一下前端的知识框架,希望对你有所帮助: