8

をオーバーライドして挿入ポイントのサイズを変更しています-(void)drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor turnedOn:(BOOL)flagが、最初の点滅を処理しません (挿入ポイントを移動すると、通常に戻ります)

private メソッドをオーバーライドすることで、最初のまばたきを処理することができました- (void)_drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor

しかし、プライベート メソッドをオーバーライドすると App Store で拒否されるため、これは私にとっては解決策ではありません。アプリをApp Storeに入れたいです。iAWriter や Writeroom などのアプリにはカスタム挿入ポイントがあり、App Store にあります。

プライベートメソッドをオーバーライドするのではなく、これをどのように実行したか、またはより良い方法を知っている人はいますか?

ありがとう。

- (void)_drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor
{
    aRect.size.width = 3.0;
    [aColor set];
    [NSBezierPath fillRect:aRect];
}

- (void)drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor turnedOn:(BOOL)flag
{
    if(flag) {
        aRect.size.width = 3.0;
        [aColor set];
        [NSBezierPath fillRect:aRect];
    }
    else {
        [self setNeedsDisplayInRect:[self visibleRect] avoidAdditionalLayout:NO];
    }
}
4

2 に答える 2

6

問題は、drawInsertionPointInRect が呼び出されたときに有効になるクリッピング パスです。

- (void)drawInsertionPointInRect:(NSRect)rect color:(NSColor *)color turnedOn:(BOOL)flag {
    rect.size.width = 8.0;
    NSBezierPath * path = [NSBezierPath bezierPathWithRect:rect];
    [path setClip]; // recklessly set the clipping area (testing only!)
    [path fill];
}

上記のコードはアーティファクトを残すことに注意してください (私のテストでは、drawInsertionPointInRect は挿入ポイントをクリアするために呼び出されず、描画するためだけに呼び出されます)。アーティファクトをクリアするには、setDrawsBackground:YES を使用します。

于 2014-07-18T11:12:25.247 に答える
0

私はアプリストアをやっていませんが、この「トリッキーな」ちょっとしたハックで、文書化されていない呼び出しが Apple のレーダーの下を飛んでしまうのではないかと思います。基本的に、オーバーライドされた文書化されていない呼び出しが行う作業を実装する無害な名前のメソッドがあります。次に、Obj-C ランタイムを使用して、実装を文書化されていないものに交換します。テキスト分析で文書化されていないメソッド名がどこにも表示されないように、SEL を ROT-13 します。Appleがこれをキャッチするかどうかはわかりません!

これが役立つかどうかはわかりませんが、少し楽しいと思いました。

(以下の 1 回限りの実装よりも、Obj-C で ROT-13 を実行するはるかに高速で賢い方法があることを私は知っています。)

@implementation MyTextView
-(void)nothingToSeeHere:(NSRect)aRect
       heyLookAtThat:(NSColor*)aColor
{
  aRect.size.width = 3.0;
  [aColor set];
  [NSBezierPath fillRect:aRect];
}

#define dipirRot @"_qenjVafregvbaCbvagVaErpg:pbybe:"
#define ntshRot @"abguvatGbFrrUrer:urlYbbxNgGung:"
+(void)initialize
{
  if (self == [MyTextView class])
  {
    SEL dipir = NSSelectorFromString([NSString rot13:dipirRot]);
    SEL ntsh = NSSelectorFromString([NSString rot13:ntshRot]);
    Method dipirMethod = class_getInstanceMethod([self class], dipir);
    Method ntshMethod = class_getInstanceMethod([self class], ntsh);
    IMP ntshIMP = method_getImplementation(ntshMethod);
    (void)method_setImplementation(dipirMethod, ntshIMP);
  }
}


@implementation NSString (Sneaky)
+(NSString*)rot13:(NSString*)s
{
  NSMutableString* ms = [[NSMutableString alloc] init];
  unsigned len = [s length];
  unsigned i;
  for (i = 0; i < len; i++)
  {
    unichar c = [s characterAtIndex:i];
    if (c <= 122 && c >= 97) c += (c + 13 > 122)? -13:13;
    else if(c <= 90 && c >= 65) c += (c + 13 > 90)? -13:13;
    [ms appendFormat:@"%C", c];
  }
  NSString* ret = [NSString stringWithString:ms];
  [ms release];
  return ret;
}
@end
于 2014-03-14T22:08:59.567 に答える