私はユーザーがビューを上下に移動できるようにしようとしてUILabel
いUIPanGestureRecognizer
ます. したがって、基本的には、ジェスチャ レコグナイザーが 12pts 下に移動することを検出した場合、制約の定数を 12pts 移動して を移動します。UILabel
UILabel
UILabel
ただし、特定の垂直ポイント (高すぎるまたは低すぎる) に達したときに、それ以上移動しないようにしたい。パン ジェスチャの翻訳を確認することはUILabel
できますが、何行でもかまいません。したがって、1 行ではなく 5 行の場合は、明らかにそこまでパンダウンできないため、翻訳に頼ることはできません。パン ジェスチャについては、ラベルのサイズを考慮する必要があります。
それで私はそのフレームを監視し始めました、そしてそれはうまくいきますが、私の実装では、彼らが完全に下限までパンすると、UILabel
「追いつく」前に本当に遠くまでパンしなければならないという厄介な結果があります。上部境界に達した場合、そのような問題はありません)。基本的に、パンは下限までパンし、パンを上に戻すと (これはすべて同じジェスチャです)、十分にパンするまで一時的に「固着」し、その後指でジャンプします。
これを達成するために私が使用しているコードは次のとおりです。
- (void)textLabelPanned:(UIPanGestureRecognizer *)panGestureRecognizer {
if (panGestureRecognizer.state == UIGestureRecognizerStateBegan) {
_textDistanceFromTopBeforeMove = self.textToReadLabelPositionFromTopConstraint.constant;
}
else if (panGestureRecognizer.state == UIGestureRecognizerStateEnded) {
NSNumber *textDistanceFromTop = @(self.textToReadLabelPositionFromTopConstraint.constant);
[[NSUserDefaults standardUserDefaults] setObject:textDistanceFromTop forKey:@"TextDistanceFromTop"];
}
else {
if (CGRectGetMinY(self.textToReadLabel.frame) >= [UIScreen mainScreen].bounds.origin.y + CLOSEST_TEXT_DISTANCE_TO_TOP && CGRectGetMaxY(self.textToReadLabel.frame) <= [UIScreen mainScreen].bounds.size.height - CLOSEST_TEXT_DISTANCE_TO_BOTTOM) {
self.textToReadLabelPositionFromTopConstraint.constant = _textDistanceFromTopBeforeMove + [panGestureRecognizer translationInView:self.mainView].y;
}
else if ([panGestureRecognizer translationInView:self.mainView].y > 0) {
if (CGRectGetMaxY(self.textToReadLabel.frame) + _textDistanceFromTopBeforeMove + [panGestureRecognizer translationInView:self.mainView].y < [UIScreen mainScreen].bounds.size.height - CLOSEST_TEXT_DISTANCE_TO_BOTTOM) {
self.textToReadLabelPositionFromTopConstraint.constant = _textDistanceFromTopBeforeMove + [panGestureRecognizer translationInView:self.mainView].y;
}
}
else if ([panGestureRecognizer translationInView:self.mainView].y < 0) {
if (CGRectGetMinY(self.textToReadLabel.frame) + _textDistanceFromTopBeforeMove + [panGestureRecognizer translationInView:self.mainView].y > [UIScreen mainScreen].bounds.origin.y + CLOSEST_TEXT_DISTANCE_TO_TOP) {
self.textToReadLabelPositionFromTopConstraint.constant = _textDistanceFromTopBeforeMove + [panGestureRecognizer translationInView:self.mainView].y;
}
}
// If one of the options views are present and the user pans really low, hide the options as to allow the user to see where they're panning
if (_inSpeedChangingMode) {
if (CGRectGetMaxY(self.textToReadLabel.frame) > CGRectGetMinY(self.progressBar.frame) - 10) {
[self showWordOptions:nil];
}
}
else if (_inTextChangingMode) {
if (CGRectGetMaxY(self.textToReadLabel.frame) > CGRectGetMinY(self.progressBar.frame) - 10) {
[self showTextOptions:nil];
}
}
}
}
それが「くっつく」原因となる、私は正確に何を間違っていますか?そして、おそらくこれを行うためのより良い方法はありますか?