æºåãªãã§
é«éèªã¿åã
QuisyReaderãš
1åããã500ã¯ãŒãã®æçš¿ãèªãã§ãç§ã¯Appleã®ã¹ããŒããã©ã³çšã«ãã®ã¢ã€ãã¢ãèªåã§å®è£
ãããã£ãã®ã§ãã ãããè¡ãããã«ã
githubã«å
¬éãããŠãããœãŒã¹ã³ãŒãã§ããAPIãéçºããŸããã
APIã®æ©èœã®åçãšãããã«åºã¥ããŠé«éèªã¿åãçšã®ããã°ã©ã ãäœæããæ¹æ³ã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
ã©ã®ããã«æ©èœããŸããïŒ
äœæãããAPIã®åºç€ã¯ãSpritzã®ååãšãåèªã®è²ä»ããšé
眮ã®æ¹æ³ã«åºã¥ããŠããŸãã
æåã«ãAPIã¯æ¯ç§æ°åèµ·åããç¹°ãè¿ãã¿ã€ããŒãéå§ããŸãã ã¿ã€ããŒã¯ãããŒã¿ãœãŒã¹ããæç»ãã次ã®åèªãèŠæ±ããã¡ãœãããåŒã³åºããŸãã åžæããåèªãåãåã£ãåŸãè²ä»ãããæåã®äœçœ®ãèŠã€ããå¿
èŠããããŸãã å®èšŒç 究ã䜿çšããŠãæåã次ã®ããã«è²ä»ããããŠããããšã確èªã§ããŸããã
- èªé·1ãæå1ã
- èªé·ã¯2ã5ã§ãã è²ä»ãã®æçŽ2ã
- èªé·ã¯6ã9ã§ãã è²ä»ãã®æçŽ3ã
- ãªã©
ãããã£ãŠãç®çã®æåã®äœçœ®ã¯ãæãç°¡åãªåŒã§èšç®ãããŸãã
(([word length] + 6) / 4) - 1;
äœçœ®ãããã£ãããNSAttributedStringã䜿çšããŠæåãç°ãªãè²ã«è²ä»ãããŸããã¡ã€ã³ã¯ãŒãã«ã¯é»ãã¢ã¯ã»ã³ãä»ãæåã«ã¯èµ€ã§ãã
ããã§ãç®çã®æåã®äžå¿ã®åº§æšãèšç®ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãiOSã®ããŒãžã§ã³ã«å¿ããŠãsizeWithFontïŒãŸãã¯sizeWithAttributesïŒã¡ãœããã䜿çšããŠæåã®å¹
ãèšç®ããŸãã
å°ããªããšã«ã€ããŠã¯ãUILabelãäœæããNSAttributedStringãããã«å
¥ããåãã¡ãœããã䜿çšããŠãéžæãããã©ã³ãã«å¯ŸããŠèšç®ãããå¹
ã§ãã¬ãŒã ãèšå®ããŸãã çµæã®UILabelãšã¢ã¯ã»ã³ãä»ãæåã®äžå¿ã®äœçœ®ã¯ãRRTargetViewã¯ã©ã¹ã«æž¡ãããŸããRRTargetViewã¯ã©ã¹ã¯ãã¿ãŒã²ããã®ã¬ã³ããªã³ã°ã«é¢äžããç®çã®æåã«çŠç¹ãåããããã®ã¿ãŒã²ããå
ã«UILabelãé
眮ããŸãã
èªè
ãæžã
githubã§å
¬éãããŠããAPIã«ã€ããŠããå°ã説æããŸããããã䜿çšããŠãã¿ã¹ã¯ãå®è£
ããŸãã
RRViewControllerã¯ã©ã¹ã¯ãæç»ãããæååã®åœ¢æãæ
åœããŸãã ãã®ã¯ã©ã¹ã«ã¯ã次ã®ãããªãã¯ããããã£ãšã¡ãœããããããŸãã
èªã¿åããéå§/äžæåæ¢ããŸãã
- (void)startReading; - (void)pauseReading;
è² ãŸãã¯æ£ã®å€ãéä¿¡ããŠãèªã¿åãé床ãå€æŽããŸãã é床ã¯1åãããã®åèªæ°ã§æž¬å®ãããŸãã
- (void)changeSpeed:(int)speedModification;
ãã©ã³ããµã€ãºãå€æŽãããšãçŸåšã®ãµã€ãºã«é¢é£ããŠè² ãŸãã¯æ£ã®å€ãæå®ãããŸãã ãããå€ã¯16ã100ã«èšå®ãããŸãã
- (void)changeFont:(int)fontModification;
RRViewControllerã¯ã©ã¹ã®Delegateããã³DataSourceãããã³ã«ãå®è£
ãããªããžã§ã¯ããžã®åç
§ãæ ŒçŽãã2ã€ã®ããããã£ã
@property (nonatomic, weak) id <RRViewControllerDataSource> dataSource; @property (nonatomic, weak) id <RRViewControllerDelegate> delegate;
ã¿ãŒã²ããã®ã¬ã³ããªã³ã°ãšããã¹ãã®é
眮ã¯ãUIViewã¯ã©ã¹ã®RIVTargetViewç¶æ¿è
ã«ãã£ãŠå®è¡ãããŸãã ã¯ã©ã¹ã«ã¯ã1ã€ã®ãããªãã¯ã¡ãœãããš1ã€ã®ããããã£ããããŸãã
ã¿ãŒã²ããã«åçŽããããæç»ããã0.0ãã1.0ã®ç¯å²ã®ãã€ã³ããèšå®ããŸããããã¹ãã¯ãã®ãã€ã³ãã«å¯ŸããŠçžå¯Ÿçã«é
眮ãããŸãã ããã©ã«ãå€ã¯1/3ã§ãã
@property (nonatomic) CGFloat horizontalAccentPosition;
ãã®ã¡ãœããã¯ãããã¹ãä»ãã®UILabelãåãå
¥ããŸãã AccentPointã¯ãåçŽããããšäœçœ®åããããããã€ã³ãã§ãã
- (void)positionLabel:(UILabel *)label withAccentPoint:(CGPoint)point;
ç»åäŸ
ãŸãã2ã€ã®ãããã³ã«ããããŸãã
RRViewControllerDelegateãããã³ã«
ã©ã¡ãã®æ¹æ³ããªãã·ã§ã³ã§ããããã©ã³ããµã€ãºãšèªã¿åãé床ã®å€æŽã«é¢ããéç¥ãåãåãããã«å¿
èŠã§ãã
- (void)reportFontSize:(CGFloat)size; - (void)reportReadingSpeed:(NSUInteger)speed;
RRViewControllerDataSourceãããã³ã«
ãªãã·ã§ã³ã®æ¹æ³ïŒ
- (NSString *)longestWordWithFont:(UIFont *)font;
ãã®ã¡ãœããã¯ãããã¹ãå
ã§æãé·ãåèªãRRViewControllerã«è¿ããŸããèªåãã©ã³ããµã€ãºéžæã·ã¹ãã ãæ©èœããå¿
èŠããããŸãã ãŸããèªåããã¹ãéžæã·ã¹ãã ãæ©èœãããã«ã¯ã[NSUserDefaults standardUserDefaults]ã®auto_text_sizeããŒã«ããŒã«å€YESãèšå®ããå¿
èŠããããŸãã
- (NSString *)previousWord;
ããã¹ãã«ãªãã¿ã®ãªãåèªãèŠã€ãããæåã§ããã«æ»ãããå Žåã«ãåã®åèªãååŸããæ¹æ³ã
2ã€ã®å¿
é ã¡ãœããïŒ
- (NSString *)nextWord;
RRViewControllerã¯ã衚瀺ãã次ã®åèªã®ããŒã¿ã¢ãã«ãç
§äŒããŸãã
- (NSString *)currentWord;
ããšãã°ãããã¹ããåæç»ããããã«ãã©ã³ããå€æŽãããå Žåã«ãçŸåšã®åèªãèŠæ±ãããŸãã
ããŠãä»ããªãã®èªè
ãæžããŠãã ããã
æåã«ããããžã§ã¯ãïŒã·ã³ã°ã«ãã¥ãŒã¢ããªã±ãŒã·ã§ã³ïŒãäœæããããšãã°Super Fast Readerãªã©ã®èª¿åã®ãšããååãä»ããŸãã
APIããããžã§ã¯ãã«ãšã¯ã¹ããŒããã
githubããããŠã³ããŒãããããã¹ãã®ã¬ã³ããªã³ã°ãè¡ããŸãã
ããã©ã«ãã®UIViewControllerãååšããã¹ããŒãªãŒããŒããéããŸãã ã³ã³ãããŒãã³ã³ãããŒã«è¿œå ããŸããã³ã³ãããŒã«é
眮ãããã³ã³ãããŒã©ãŒã¯ã©ã¹ãšããŠãRRViewControllerãæå®ããŸãã ãŸããããã¹ããå¶åŸ¡ããã³å
¥åããããã®èŠçŽ ãå¿
èŠã§ãã ãéå§ãããäžæåæ¢ããã¿ã³ãããã¹ãå
¥åãã£ãŒã«ãUITextViewãUIViewãè¿œå ããŸãããããã«ã¯ãããããã°ã«ãŒãåããããã®ãã¹ãŠã®ã³ã³ãããŒã«ãé
眮ãããŸãããŸããã³ã³ãããŒã«ãšã³ã³ãããŒãšUIViewãé
眮ããUIScrollViewãè¿œå ããŸãã 次ã«ããããã®èŠçŽ ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«é¢é£ä»ããŸãã UItextViewãšUIScrollViewã®IBOutletãšãéå§ãã¿ã³ãšäžæåæ¢ãã¿ã³ã®ã¯ãªãã¯ãåŠçããããã®2ã€ã®IBActionãäœæããŸãã
@property (weak, nonatomic) IBOutlet UITextView *textView; @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; - (IBAction)startReading:(UIButton *)sender; - (IBAction)pauseReading:(UIButton *)sender;
ã¹ããŒãªãŒããŒããã¥ãŒ
ãã¥ãŒéå±€
RRViewControllerã䜿çšãããšããæ¥ãŸããã
æåã«è¡ãããšã¯ããããžã®ãªã³ã¯ãååŸããããšã§ãã ã³ã³ãããäœæãããšããåã蟌ã¿ã»ã°ãšããèªåçã«äœæãããInterfaceBuilderã䜿çšããŠRVCBecomesChildãªã©ã®ååãå²ãåœãŠãŸãã ããã°ã©ã ã®å®è¡æã«ãRRViewControllerãã³ã³ããã«è¿œå ãããšãprepareForSegueïŒsenderïŒã¡ãœãããåŒã³åºãããŸãããã®ã¡ãœããã䜿çšããŸãã
æåã«ããªããžã§ã¯ããžã®åç
§ãä¿åãããããããã£ãäœæããŸãã
@property (weak, nonatomic) RRViewController *readingVC;
次ã«ãã¡ãœãããå®è£
ããŸãã
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"RVCBecomesChild"]) { self.readingVC = segue.destinationViewController; } }
ã³ã³ãããŒã©ãŒãžã®ãªã³ã¯ããããŸãã 次ã¯ïŒ
ãããŠãRRViewControllerã¯ã©ã¹ã®RRViewControllerDataSourceãããã³ã«ã®å¿
èŠãªã¡ãœãããå®è£
ããå¿
èŠããããŸãã
- (NSString *)nextWord; - (NSString *)currentWord;
æåã«è¡ãå¿
èŠãããã®ã¯ãRRViewControllerã«ããŒã¿ãœãŒã¹ã§ããããšãäŒããããšã§ãã
- (void)viewDidLoad { [super viewDidLoad]; self.readingVC.dataSource = self; }
ãããã³ã«ããµããŒãããŠããããšãã³ã³ãã€ã©ã«äŒããããšãå¿ããªãã§ãã ããã
@interface SFRViewController () <RRViewControllerDataSource>
ããã¯ãself.readingVC.dataSource = selfãå²ãåœãŠããšãã«ã³ã³ãã€ã©ãŒãèŠåãåºããããŸã@requiredãšããŠããŒã¯ããããã¹ãŠã®ã¡ãœãããå®è£
ãããŠããªãå Žåã«èŠåãåãåãããã«å¿
èŠã§ãã
UITextViewãã£ãŒã«ãããèªã¿åãããã¹ããååŸããããã«ããã¹ãå
ã®çŸåšã®äœçœ®ã衚瀺ããå€æ°ãå¿
èŠã«ãªããŸãã
@property (nonatomic) NSUInteger currentWord; - (NSString *)nextWord { self.textPosition++; NSArray *words = [self.textView.text componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; if (self.textPosition >= [words count]) { self.textPosition = 0; } return [words objectAtIndex:self.textPosition]; } - (NSString *)currentWord { NSArray *words = [self.textView.text componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; if (self.textPosition >= [words count]) { self.textPosition = 0; } return [words objectAtIndex:self.textPosition]; }
æãåççãªå®è£
ã§ã¯ãããŸãããååèªãã¯ãšãªãããšãã¯ããã¹ãå
šäœã解æãããããããã¹ããå€æŽãããšãã«äžåºŠãããå®è¡ããçµæãå€æ°ã«ä¿åããæ¹ãããããã§ãã ã©ã®æ¹æ³ã§ãããå®è£
ã§ãããã«ã€ããŠã¯ãå°ãåŸã§èª¬æããŸãã
次ã«ããã¿ã³ã®ã¢ã¯ã·ã§ã³ãå®è£
ããŸã;ãã®ããã«ãRRViewControllerã¯ã©ã¹ã®ã¡ãœãããåŒã³åºããŸãã
- (IBAction)startReading:(UIButton *)sender { [self.readingVC startReading]; } - (IBAction)pauseReading:(UIButton *)sender { [self.readingVC pauseReading]; }
ã§ãã ããã°ã©ã ãå®è¡ããŠçµæã楜ããããšãã§ããŸãã
ããã¯ãã°ã§ã¯ãªããæ©èœã§ã
é床ãéåžžã«é
ãããã©ã³ããå°ããããšãããã«ããããŸãã ãã®åé¡ã¯éåžžã«ç°¡åã«è§£æ±ºãããŸãã RRViewControllerã¡ãœãããåŒã³åºããã¿ã³ãäœæããŸãã ã¡ãœãããžã®åŒæ°ãšããŠããããã®ãã©ã¡ãŒã¿ãŒãã©ãã ãå€åãããã瀺ãè² ãŸãã¯æ£ã®æŽæ°ãæž¡ãããŸãã
- (void)changeSpeed:(int)speedModification; - (void)changeFont:(int)fontModification;
ãããã®ã¡ãœããã®å®è£
ã¯ãŠãŒã¶ãŒã®è£éã«ä»»ãããå¥ã®åé¡ã解決ããŸãã
ç§ãã¡ã®ããã°ã©ã ã§ã¯ãããã¹ããè¿œå ããããšãããšãããŒããŒããå
¥åãã£ãŒã«ããšéãªããEnterããŒãæŒããŠãããŒããŒããã¯ãªã¢ãããŸããïŒUITextViewã䜿çšããŠè€æ°è¡ã®ããã¹ããå
¥åããEnterããŒãæŒããšæ¹è¡æåãããã¹ãã«æ¿å
¥ãããããããã ãããã®åäœã¯å€æŽã§ããŸãïŒã
ãã®åé¡ã解決ããã«ã¯ãããã¹ããã£ãŒã«ãããå¿çãåãåãå¿
èŠããããŸãã ãããè¡ãã«ã¯ãViewControllerã¯ã©ã¹ãUITextViewã¯ã©ã¹ã®ä»£çã§ããããã®ãããã³ã«ãå®è£
ããŠããããšã圌ã«ç¥ãããŸãã
@interface SFRViewController () <RRViewControllerDataSource, UITextViewDelegate>
ãŸããããŒããŒãããã®ã¡ãã»ãŒãžãåä¿¡ããããã«ãµãã¹ã¯ã©ã€ãããå¿
èŠãããããã®å€èŠ³ã«é¢ããã¡ãã»ãŒãžãšãšãã«ãçŸåšã®ãµã€ãºãå«ããã£ã¯ã·ã§ããªãåä¿¡ããUIScrollViewãªãã»ãããèšç®ããå¿
èŠããããŸãã
- (void)viewDidLoad { [super viewDidLoad]; self.readingVC.dataSource = self; self.textView.delegate = self; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardWillShowNotification object:nil]; }
次ã«ãå¿
èŠãª2ã€ã®ã¡ãœãããå®è£
ããŸãã
ãŸããããŒããŒãã衚瀺ããããšãã«åŒã³åºãããã¡ãœããïŒ
- (void)keyboardWasShown:(NSNotification *)notification { CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; [self.scrollView setContentInset:UIEdgeInsetsMake(-keyboardSize.height, 0, 0, 0)]; }
çŸåšãããã¹ãã®å€æŽãåŠçããŠããŸãã æ¹è¡æåã\ nããæ¿å
¥ãããŠããå Žåã¯ãããŒããŒããåé€ããUIScrollViewã®åçŽãªãã»ãããåé€ããŸãã ãšããã§ãåãã¡ãœããã§ãããã¹ãã®å€æŽæã«1åå®è¡ãããããã«ãæååã®è§£æãå®è£
ã§ããŸãã
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if ([text isEqualToString:@"\n"]) { [textView resignFirstResponder]; } return YES; }
åã³å§ããŸãã ããŸãããïŒ çµæã楜ããã§ãèªåã®ã¢ã€ãã¢ã®å®è£
ã«åãââçµãããšãã§ããŸãã
åœç¶ã®ããšãªããããã®èšäºã§ã¯ããŒã¿ãååŸããæãç°¡åãªæ¹æ³ã瀺ããŸãããããæèœãªå®è£
ã®å ŽåãããŒã¿ã®è§£æãšæäŸãè¡ãå¥ã®ã¯ã©ã¹ãäœæãã䟡å€ããããŸãã
ããšãã
APIã¯éçº/æ¹è¯æ®µéã«ãããããã³ã¡ã³ããææ¡ã®å€æŽãåãå
¥ãããããªããžããªãåå²ããŠç¬èªã®æ¹æ³ã§å€æŽãå ããããšãã§ããŸãã
çŽ æµãªèªæžãïŒ