ইউআইএসক্রোলভিউ: অনুভূমিকভাবে পেজিং করছেন, উল্লম্বভাবে স্ক্রোলিং করছেন?


89

আমি কীভাবে এমন কোনও জোর করতে পারি UIScrollViewযেখানে একটি নির্দিষ্ট মুহুর্তে কেবল পেজিং এবং স্ক্রোলিং উল্লম্ব বা অনুভূমিকভাবে সরানো হয়?

আমার বোধগম্যটি হ'ল directionalLockEnabledসম্পত্তিটি অর্জন করা উচিত, তবে একটি তির্যক সোয়াইপ এখনও একটি অক্ষকে গতি সীমাবদ্ধ না করে দৃশ্যটি তির্যকভাবে স্ক্রোল করে।

সম্পাদনা: পরিষ্কার হওয়ার জন্য, আমি ব্যবহারকারীকে অনুভূমিকভাবে বা উলম্বভাবে স্ক্রোল করার অনুমতি দিতে চাই, তবে উভয়ই একই সাথে নয়।


আপনি কি কেবলমাত্র হোরিজ / ভার্টকে স্ক্রোল করার জন্য কোনও দৃশ্যকে সীমাবদ্ধ রাখতে চান বা আপনি ব্যবহারকারী হরিজ বা ভার্ট স্ক্রোল করতে চান, তবে উভয়ই একই সাথে নয়?
হার্টুং

আপনি কি আমাকে অনুগ্রহ করতে পারেন এবং শিরোনাম পরিবর্তন করতে পারেন যাতে এটি কিছুটা আকর্ষণীয় এবং তুচ্ছ মনে হয়? "ইউআইএসক্রোলভিউয়ের মতো: অনুভূমিকভাবে পেজিং করা, উল্লম্বভাবে স্ক্রোলিং করা?"
আন্দ্রে তারানসভ

দুর্ভাগ্যক্রমে, আমি একটি কম্পিউটারে নিবন্ধিত ব্যবহারকারী হিসাবে প্রশ্নটি পোস্ট করেছি যার অ্যাক্সেস আমার আর নেই (আমি বাড়ি পৌঁছে যাওয়ার পরে একই নামে নিবন্ধন করার আগে) যার অর্থ আমি এটি সম্পাদনা করতে পারছি না। এটিতে আসল প্রশ্নটি সম্পাদনা করার পরিবর্তে আমাকে নিম্ন-নিচেরটি সম্পর্কেও ব্যাখ্যা করা উচিত। এবার স্ট্যাক শিষ্টাচার ভঙ্গ করার জন্য দুঃখিত!
নিক

উত্তর:


117

আপনি খুব কঠিন পরিস্থিতিতে আছেন, আমাকে অবশ্যই বলতে হবে।

নোট করুন যে pagingEnabled=YESপৃষ্ঠাগুলির মধ্যে স্যুইচ করতে আপনার একটি ইউআইএসক্রোলভিউ ব্যবহার করা দরকার তবে আপনাকে pagingEnabled=NOউল্লম্বভাবে স্ক্রোল করা দরকার ।

সম্ভাব্য 2 কৌশল রয়েছে। আমি জানি না কোনটি কার্যকর হবে / কার্যকর করা সহজ, তাই উভয়ই চেষ্টা করে দেখুন।

প্রথম: নেস্টেড ইউআইএসক্রোলভিউস। সত্যই, আমি এখনও এমন একজনকে দেখতে পাচ্ছি না যিনি এই কাজ করতে পেরেছেন। তবে আমি ব্যক্তিগতভাবে যথেষ্ট চেষ্টা করে দেখিনি, এবং আমার অনুশীলনটি দেখায় যে আপনি যখন যথেষ্ট চেষ্টা করেন, আপনি ইউআইএসক্রোলভিউকে আপনার পছন্দমতো কিছু করতে পারেন

সুতরাং কৌশলটি হ'ল বাইরের স্ক্রোল ভিউটি কেবল অনুভূমিক স্ক্রোলিং এবং অভ্যন্তরীণ স্ক্রোল ভিউগুলি কেবল উল্লম্ব স্ক্রোলিং পরিচালনা করতে দেয়। এটি সম্পাদন করতে, আপনাকে অবশ্যই জানতে হবে ইউআইএসক্রলভিউ অভ্যন্তরীণভাবে কীভাবে কাজ করে। এটি hitTestপদ্ধতিটিকে ওভাররাইড করে এবং সর্বদা নিজেই ফিরে আসে, যাতে সমস্ত স্পর্শ ইভেন্টগুলি ইউআইএসক্রোলভিউতে যায়। তারপরে ভিতরে touchesBegan, touchesMovedইত্যাদি এটি ইভেন্টে আগ্রহী কিনা তা পরীক্ষা করে এবং এটি পরিচালনা করে বা অভ্যন্তরীণ উপাদানগুলিতে প্রেরণ করে।

স্পর্শটি পরিচালনা করতে হবে বা ফরোয়ার্ড করা হবে কিনা তা সিদ্ধান্ত নিতে, ইউআইএসক্রোলভিউ যখন আপনি প্রথম স্পর্শ করেন তখন একটি টাইমার শুরু করে:

  • যদি আপনি 150 মিটারের মধ্যে উল্লেখযোগ্যভাবে আপনার আঙুলটি সরান না, তবে ইভেন্টটি অভ্যন্তরীণ দৃশ্যে চলে যায়।

  • যদি আপনি 150 মিটারের মধ্যে উল্লেখযোগ্যভাবে আপনার আঙুলটি স্থানান্তরিত করে থাকেন তবে এটি স্ক্রোলিং শুরু হয় (এবং কখনই ইভেন্টটি অভ্যন্তরীণ দৃশ্যে পাস করে না)।

    আপনি কীভাবে কোনও টেবিলটি স্পর্শ করবেন (যা স্ক্রোল ভিউয়ের একটি সাবক্লাস) এবং ততক্ষণে স্ক্রোলিং শুরু করবেন, আপনি যে সারিটি স্পর্শ করেছেন তা কখনই হাইলাইট হয় না।

  • আপনি যদি না 150ms মধ্যে উল্লেখযোগ্যভাবে আপনার আঙুল সরানো এবং UIScrollView ভেতরের দৃশ্যে ঘটনা ক্ষণস্থায়ী শুরু করেছিলাম, কিন্তু তারপর আপনি শুরু করার স্ক্রলিং, UIScrollView আহ্বান জন্য খুব বেশী কথা আঙুল সরানো হয়েছে touchesCancelledভেতরের দৃশ্য এবং শুরু হয় স্ক্রলিং।

    আপনি যখন কোনও টেবিলটি স্পর্শ করেন তখন কীভাবে আপনার আঙুলটি কিছুটা ধরে রাখুন এবং তারপরে স্ক্রোলিং শুরু করুন, আপনি যে সারিটি স্পর্শ করেছেন তা প্রথমে হাইলাইট করা হবে তবে পরে ডি-হাইলাইট হবে Note

ইভেন্টগুলির এই ক্রমটি ইউআইএসক্রোলভিউয়ের কনফিগারেশনের মাধ্যমে পরিবর্তিত হতে পারে:

  • যদি delaysContentTouchesনা হয়, তবে কোনও টাইমার ব্যবহার করা হয় না - ইভেন্টগুলি তত্ক্ষণাত্ অভ্যন্তরীণ নিয়ন্ত্রণে চলে যায় (তবে আপনি যদি আপনার আঙুলটি যথেষ্ট পরিমাণে সরান তবে বাতিল হয়ে যায়)
  • যদি cancelsTouchesনা হয়, তবে ইভেন্টগুলি একবার নিয়ন্ত্রণে প্রেরণ করা হলে, স্ক্রোলিং কখনই ঘটবে না।

মনে রাখবেন যে UIScrollView যে পায় সব touchesBegin , touchesMoved, touchesEndedএবং touchesCanceledCocoaTouch থেকে ইভেন্টগুলি (কারণ এটির hitTestসে কি এটি করতে বলে)। এটি এটি যতক্ষণ চাইলে অভ্যন্তরীণ দৃশ্যে ফরোয়ার্ড করে।

আপনি এখন ইউআইএসক্রোলভিউ সম্পর্কে সমস্ত কিছু জানেন, আপনি এর আচরণটি পরিবর্তন করতে পারেন। আমি বাজি ধরতে পারি যে আপনি উল্লম্ব স্ক্রোলিংকে অগ্রাধিকার দিতে চান, যাতে ব্যবহারকারী একবার দৃষ্টি আকর্ষণ করে এবং তার আঙুলটি (এমনকি সামান্য) চালানো শুরু করে, দর্শনটি উল্লম্ব দিকে স্ক্রোলিং শুরু করে; তবে যখন ব্যবহারকারী তার আঙুলটি অনুভূমিক দিকের দিকে যথেষ্ট পরিমাণে সরান, আপনি উলম্ব স্ক্রোলিং বাতিল করতে এবং অনুভূমিক স্ক্রোলিং শুরু করতে চান।

আপনি আপনার বাহ্যিক ইউআইএসক্রোলভিউটি সাবক্লাস করতে চান (বলুন, আপনি নিজের শ্রেণীর নাম রাখেন রিসরসফুলসক্রোলভিউ), যাতে ডিফল্ট আচরণের পরিবর্তে এটি তাত্ক্ষণিকভাবে সমস্ত ইভেন্টকে অভ্যন্তরীণ দৃশ্যে ফরোয়ার্ড করে দেয় এবং কেবলমাত্র যখন অনুভূমিক আন্দোলন সনাক্ত হয় তখন এটি স্ক্রোল হয়।

রিমর্সফুলসক্রোলভিউকে কীভাবে এমন আচরণ করা যায়?

  • দেখে মনে হচ্ছে উল্লম্ব স্ক্রোলিংটি অক্ষম করা এবং delaysContentTouchesNO এ সেট করার ফলে নেস্টেড ইউআইএসক্রোলভিউগুলি কাজ করা উচিত। দুর্ভাগ্যক্রমে, এটি না; ইউআইএসক্রোলভিউ দ্রুত গতির (যা অক্ষম করা যায় না) জন্য কিছু অতিরিক্ত ফিল্টারিং করতে দেখা যায়, যাতে ইউআইএসক্রোলভিউ কেবল অনুভূমিকভাবে স্ক্রোল করা যায়, তবে এটি সর্বদা যথেষ্ট পরিমাণে উল্লম্ব গতি খায় (এবং উপেক্ষা করবে)।

    প্রভাবটি এত মারাত্মক যে নেস্টেড স্ক্রোল ভিউয়ের অভ্যন্তরে উল্লম্ব স্ক্রোলিংটি ব্যবহারযোগ্য নয়। (মনে হচ্ছে আপনি ঠিক এই সেটআপটি পেয়েছেন, তাই এটি চেষ্টা করে দেখুন: 150 মিমি ধরে একটি আঙুল ধরে এবং তারপরে এটি উল্লম্ব দিকে চালিত করুন - নেস্টেড ইউআইএসক্রোলভিউ তখন প্রত্যাশার মতো কাজ করে!)

  • এর অর্থ আপনি ইভেন্ট হ্যান্ডলিংয়ের জন্য ইউআইএসক্রোলভিউ কোড ব্যবহার করতে পারবেন না; আপনাকে রিমর্সফুলসক্রোলভিউতে চারটি টাচ হ্যান্ডলিং পদ্ধতি ওভাররাইড করতে হবে এবং প্রথমে আপনার নিজের প্রসেসিং superকরতে হবে, যদি আপনি অনুভূমিক স্ক্রোলিংয়ের সাথে যাওয়ার সিদ্ধান্ত নিয়ে থাকেন তবে ইভেন্টটিকে কেবল (ইউআইএসক্রোলভিউ) ফরোয়ার্ড করতে হবে।

  • তবে আপনি পাস করতে হবে touchesBegan, কারণ আপনি এটা (যদি আপনি পরে সিদ্ধান্ত নেন এটা একটি বেস ভবিষ্যৎ অনুভূমিক স্ক্রলিং জন্য তুল্য মনে রাখতে চান UIScrollView করতে হয় একটি অনুভূমিক স্ক্রলিং)। আপনি touchesBeganপরে ইউআইএসক্রোলভিউতে প্রেরণ করতে পারবেন না, কারণ আপনি touchesযুক্তিটি সংরক্ষণ করতে পারবেন না : এটিতে এমন বস্তু রয়েছে যা পরের touchesMovedইভেন্টের আগে রূপান্তরিত হবে এবং আপনি পুরানো অবস্থায় পুনরুত্পাদন করতে পারবেন না।

    সুতরাং আপনাকে touchesBeganঅবিলম্বে ইউআইএসক্রোলভিউতে যেতে হবে, তবে আপনি touchesMovedযতক্ষণ না অনুভূমিকভাবে স্ক্রোল করার সিদ্ধান্ত নেন ততক্ষণ আপনি এ থেকে আর কোনও ইভেন্ট লুকিয়ে রাখবেন । এর touchesMovedঅর্থ কোনও স্ক্রোলিং নয়, সুতরাং এই প্রাথমিকটি touchesBeganকোনও ক্ষতি করবে না। তবে delaysContentTouchesকোনটি সেট করবেন না, যাতে কোনও অতিরিক্ত বিস্ময়কর টাইমাররা হস্তক্ষেপ না করে।

    (Offtopic - আপনি মতো UIScrollView করতে ছোঁয়া সঠিকভাবে সংরক্ষণ এবং পুননির্মান ও ফরোয়ার্ড মূল পারেন touchesBegan, যাতে করতে পারেন ক্লোন স্পর্শ বস্তু আগে তারা ভাবে পরিবর্তিত হয় ঘটনা পরে অপ্রকাশিত API গুলি ব্যবহার করে একটি অন্যায্য সুবিধা রয়েছে।।)

  • আপনি সর্বদা ফরোয়ার্ড দিয়েছিলেন touchesBegan, আপনাকেও ফরওয়ার্ড করতে হবে touchesCancelledএবং touchesEnded। আপনি চালু আছে touchesEndedমধ্যে touchesCancelledঅবশ্য কারণ UIScrollView অর্থ করবেন touchesBegan, touchesEndedএকটি স্পর্শ-ক্লিক যেমন ক্রম এবং ভিতরের দেখতে এটিকে ফরোয়ার্ড হবে। আপনি ইতিমধ্যে যথাযথ ইভেন্টগুলি নিজেই ফরোয়ার্ড করছেন, তাই আপনি কখনই ইউআইএসক্রোলভিউকে কিছু ফরোয়ার্ড করতে চান না।

আপনার যা করা দরকার তা মূলত এখানে সিউডোকোড। সরলতার জন্য, মাল্টিটাচ ইভেন্টটি আসার পরে আমি কখনই অনুভূমিক স্ক্রোলিংকে অনুমতি দিই না।

// RemorsefulScrollView.h

@interface RemorsefulScrollView : UIScrollView {
  CGPoint _originalPoint;
  BOOL _isHorizontalScroll, _isMultitouch;
  UIView *_currentChild;
}
@end

// RemorsefulScrollView.m

// the numbers from an example in Apple docs, may need to tune them
#define kThresholdX 12.0f
#define kThresholdY 4.0f

@implementation RemorsefulScrollView

- (id)initWithFrame:(CGRect)frame {
  if (self = [super initWithFrame:frame]) {
    self.delaysContentTouches = NO;
  }
  return self;
}

- (id)initWithCoder:(NSCoder *)coder {
  if (self = [super initWithCoder:coder]) {
    self.delaysContentTouches = NO;
  }
  return self;
}

- (UIView *)honestHitTest:(CGPoint)point withEvent:(UIEvent *)event {
  UIView *result = nil;
  for (UIView *child in self.subviews)
    if ([child pointInside:point withEvent:event])
      if ((result = [child hitTest:point withEvent:event]) != nil)
        break;
  return result;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event]; // always forward touchesBegan -- there's no way to forward it later
    if (_isHorizontalScroll)
      return; // UIScrollView is in charge now
    if ([touches count] == [[event touchesForView:self] count]) { // initial touch
      _originalPoint = [[touches anyObject] locationInView:self];
    _currentChild = [self honestHitTest:_originalPoint withEvent:event];
    _isMultitouch = NO;
    }
  _isMultitouch |= ([[event touchesForView:self] count] > 1);
  [_currentChild touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
  if (!_isHorizontalScroll && !_isMultitouch) {
    CGPoint point = [[touches anyObject] locationInView:self];
    if (fabsf(_originalPoint.x - point.x) > kThresholdX && fabsf(_originalPoint.y - point.y) < kThresholdY) {
      _isHorizontalScroll = YES;
      [_currentChild touchesCancelled:[event touchesForView:self] withEvent:event]
    }
  }
  if (_isHorizontalScroll)
    [super touchesMoved:touches withEvent:event]; // UIScrollView only kicks in on horizontal scroll
  else
    [_currentChild touchesMoved:touches withEvent:event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  if (_isHorizontalScroll)
    [super touchesEnded:touches withEvent:event];
    else {
    [super touchesCancelled:touches withEvent:event];
    [_currentChild touchesEnded:touches withEvent:event];
    }
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
  [super touchesCancelled:touches withEvent:event];
  if (!_isHorizontalScroll)
    [_currentChild touchesCancelled:touches withEvent:event];
}

@end

আমি এটি চালানোর বা এমনকি সংকলনের চেষ্টা করিনি (এবং একটি সম্পূর্ণ পাঠ্য সম্পাদককে পুরো ক্লাসটি টাইপ করেছেন), তবে আপনি উপরেরটি দিয়ে শুরু করতে পারেন এবং আশা করি এটি কাজ করে চলেছে।

আমি দেখি কেবল লুকানো ধরাটি হ'ল আপনি যদি রিমসারফুলসক্রোলভিউতে কোনও অ-ইউআইএসক্রোলভিউ চাইল্ড ভিউ যুক্ত করেন তবে আপনার কোনও সন্তানের কাছে ফর্চার করা স্পর্শ ইভেন্টগুলি প্রতিক্রিয়াশীল চেইনের মাধ্যমে আপনার কাছে ফিরে আসতে পারে, যদি শিশু সবসময় ইউআইএসক্রোলভিউয়ের মতো স্পর্শগুলি পরিচালনা না করে। একটি বুলেট-প্রমাণ রিমর্সফুলসক্রোলভিউ বাস্তবায়ন রিেন্ট্রি থেকে রক্ষা করবে touchesXxx

দ্বিতীয় কৌশল: যদি কোনও কারণে নেস্টেড ইউআইএসক্রোলভিউগুলি কার্যকর না হয় বা ডান পেতে খুব কঠিন প্রমাণিত না হয় তবে আপনি কেবলমাত্র একটি ইউআইএসক্রোলভিউয়ের সাথে যেতে চেষ্টা করতে পারেন, pagingEnabledআপনার scrollViewDidScrollপ্রতিনিধি পদ্ধতি থেকে ফ্লাইতে তার সম্পত্তিটি স্যুইচ করে ।

তির্যকীয় স্ক্রোলিং রোধ করতে আপনার প্রথমে কন্টেন্টঅফসেটটি মনে রাখা scrollViewWillBeginDraggingএবং কন্টেন্টআফেসটি চেক করা এবং পুনরায় সেট করার চেষ্টা করা উচিত scrollViewDidScrollযদি আপনি একটি তির্যক গতিবিধি সনাক্ত করেন। আরেকটি কৌশল চেষ্টা করার বিষয় হ'ল কন্টেন্টসাইজটি কেবলমাত্র এক দিকে স্ক্রোলিং সক্ষম করার জন্য, একবার আপনি সিদ্ধান্ত নেন যে ব্যবহারকারীর আঙুলটি কোন দিকে যাচ্ছে। (ইউআইএসক্রোলভিউ এর প্রতিনিধি পদ্ধতিগুলি থেকে কন্টেন্টসাইজ এবং কন্টেন্টঅফসেটের সাথে ফিডিং সম্পর্কে বেশ ক্ষমাশীল বলে মনে হচ্ছে))

যে পঙ্কিল ভিজ্যুয়াল কাজ করুন অথবা ফলাফল না থাকে, তাহলে আপনি ওভাররাইড করতে হবে touchesBegan, touchesMovedইত্যাদি এবং UIScrollView না এগিয়ে তির্যক আন্দোলন ইভেন্ট নেই। (তবে ব্যবহারকারীর অভিজ্ঞতা এক্ষেত্রে সাবঅস্টিমাল হবে, কারণ আপনাকে একক দিকের দিকে চাপ দেওয়ার পরিবর্তে তির্যক গতিবিধিগুলি উপেক্ষা করতে হবে you're আপনি যদি সত্যিই সাহসী বোধ করেন তবে আপনি নিজের ইউআইটিউচ লুকিয়াকে লিখতে পারেন, রিভেঞ্জটচের মতো কিছু j উদ্দেশ্য) -সি সরল পুরাতন সি, এবং পৃথিবীতে সি-এর চেয়ে বেশি দুষ্টু কিছু নেই; যতক্ষণ না নূন যতক্ষণ না আমার বিশ্বাস বিশ্বাসযোগ্য বস্তুর আসল শ্রেণি পরীক্ষা করে, আপনি যে কোনও শ্রেণিকে অন্য শ্রেণীর মতো দেখতে পারেন like এটি খোলে। আপনার চাইলে যে কোনও ছোঁয়া, যে কোনও স্থানাঙ্কের সাথে সংশ্লেষ করার সম্ভাবনা))

ব্যাকআপ কৌশল: টিটিএসক্রোলভিউ রয়েছে, থ্রি -20 লাইব্রেরিতে ইউআইএসক্রোলভিউয়ের বুদ্ধিমান পুনরায় বাস্তবায়ন । দুর্ভাগ্যক্রমে এটি ব্যবহারকারীর কাছে খুব অপ্রাকৃত এবং আইফোনিশ বোধ করে। তবে যদি ইউআইএসক্রোলভিউ ব্যবহারের প্রতিটি প্রচেষ্টা ব্যর্থ হয়, আপনি কাস্টম-কোডেড স্ক্রোল দৃশ্যে ফিরে যেতে পারেন। আমি যদি সম্ভব হয় তবে এর বিরুদ্ধে সুপারিশ করছি; ইউআইএসক্রোলভিউ ব্যবহার করে এটি নিশ্চিত করে যে আপনি ভবিষ্যতের আইফোন ওএস সংস্করণগুলিতে এটি কীভাবে বিকশিত হয় তা দেশীয় চেহারা এবং অনুভূতি পাচ্ছে।

ঠিক আছে, এই ছোট্ট প্রবন্ধটি কিছুটা দীর্ঘ হয়েছে। বেশ কয়েকদিন আগে স্ক্রলিংম্যাডনেস কাজ করার পরে আমি কেবল এখনও ইউআইএসক্রোলভিউ গেমসে আছি।

পিএস যদি আপনি এইগুলির মধ্যে কোনও কাজ পেয়ে থাকেন এবং ভাগ করে নেওয়ার মত বোধ করেন তবে অনুগ্রহ করে আমাকে andreyvit@gmail.com এ প্রাসঙ্গিক কোডটি ইমেল করুন, আমি আনন্দের সাথে এটিকে আমার স্ক্রোলিংম্যাডেস ব্যাগের কৌশলগুলিতে অন্তর্ভুক্ত করব

পিপিএস এই ছোট্ট প্রবন্ধটি স্ক্রোলিংম্যাডনেস রিডমিতে যুক্ত করা হচ্ছে।


7
নোট করুন যে এই নেস্টেড স্ক্রোলভিউ আচরণটি এসডিকে এখন বাক্সের বাইরে কাজ করে, কোনও মজার ব্যবসায়ের প্রয়োজন নেই
অ্যান্ডিজার্স

4
অ্যান্ডিজাররা মন্তব্য করেছে, তারপরে বুঝতে পেরেছিল যে এটি সঠিক নয়; আপনি এখনও প্রারম্ভিক বিন্দু থেকে তির্যকভাবে টেনে নিয়মিত ইউআইএসক্রোলভিউকে "ব্রেক" করতে পারেন এবং তারপরে আপনি "স্ক্রোলারকে হারাতে টানতে" দিয়েছেন এবং আপনি মুক্তি না দেওয়া এবং godশ্বর জানেন না হওয়া পর্যন্ত এটি দিকনির্দেশক লকটিকে উপেক্ষা করবে।
কালে

পর্দার দুর্দান্ত ব্যাখ্যাগুলির জন্য ধন্যবাদ! আমি নীচে মাতিয়াস ওয়াদম্যানের সমাধান নিয়ে গিয়েছিলাম যা দেখতে কিছুটা কম আক্রমণাত্মক আইএমও দেখায়।
অর্টউইন জেন্টজ

এই উত্তরটি এখনই আপডেট হওয়া দেখতে দুর্দান্ত লাগবে যে ইউআইএসক্রোলভিউ তার প্যান অঙ্গভঙ্গি সনাক্তকারীকে প্রকাশ করে। (তবে সম্ভবত এটি মূল ক্ষেত্রের বাইরে))
জেটব্যান্ডস

এই পোস্টটি আপডেট হওয়ার সম্ভাবনা আছে কি? দুর্দান্ত পোস্ট এবং আপনার ইনপুট জন্য আপনাকে ধন্যবাদ।
Pavan

56

এটি আমার জন্য প্রতিটি সময় কাজ করে ...

scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * NumberOfPages, 1);

20
অন্য কারও পক্ষে এই প্রশ্নে হোঁচট খাচ্ছে: আমি মনে করি এই উত্তরটি সম্পাদনা করার আগে পোস্ট করা হয়েছিল যা প্রশ্নটি পরিষ্কার করে দিয়েছে। এটি আপনাকে কেবল অনুভূমিকভাবে স্ক্রোল করার অনুমতি দেবে , এটি উল্লম্ব বা অনুভূমিকভাবে স্ক্রোল করতে সক্ষম হওয়ার বিষয়টি বিবেচনা করে না তবে তির্যক নয়।
andygeers

আমার জন্য একটি যাদুমন্ত্র মত কাজ করে। আমার পেজিং সহ একটি দীর্ঘ দীর্ঘ অনুভূমিক স্ক্রোলভিউ এবং প্রতিটি পৃষ্ঠায় একটি ইউআইবিউবভিউ রয়েছে যা আমার প্রয়োজন উল্লম্ব স্ক্রোলিং পরিচালনা করে।
টম রেডম্যান

দুর্দান্ত! তবে কেউ কীভাবে এটি ব্যাখ্যা করতে পারে (কন্টেন্টসাইজ উচ্চতা 1 এ সেট করে)!
প্রবীণ

এটি সত্যিই কাজ করে তবে কেন এবং কীভাবে এটি কাজ করে? কেউ কি এর বাইরে কিছু বোঝাতে পারে?
মার্কো ফ্রান্সকোভিচ

27

আমার মতো অলস লোকের জন্য:

সেট scrollview.directionalLockEnabledকরুনYES

- (void) scrollViewWillBeginDragging: (UIScrollView *) scrollView
{
    self.oldContentOffset = scrollView.contentOffset;
}

- (void) scrollViewDidScroll: (UIScrollView *) scrollView
{
    if (scrollView.contentOffset.x != self.oldContentOffset.x)
    {
        scrollView.pagingEnabled = YES;
        scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x,
                                               self.oldContentOffset.y);
    }
    else
    {
        scrollView.pagingEnabled = NO;
    }
}

- (void) scrollViewDidEndDecelerating: (UIScrollView *) scrollView
{
    self.oldContentOffset = scrollView.contentOffset;
}

16

আমি এই সমস্যাটি সমাধানের জন্য নিম্নলিখিত পদ্ধতিটি ব্যবহার করেছি, আশা করি এটি আপনাকে সহায়তা করবে।

প্রথমে আপনার নিয়ামক শিরোনাম ফাইলটিতে নিম্নলিখিত ভেরিয়েবলগুলি সংজ্ঞায়িত করুন।

CGPoint startPos;
int     scrollDirection;

startPos রাখা হবে contentOffset মান যখন আপনার প্রতিনিধি পায় scrollViewWillBeginDragging বার্তা। সুতরাং এই পদ্ধতিতে আমরা এটি করি;

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
    startPos = scrollView.contentOffset;
    scrollDirection=0;
}

তারপরে আমরা এই মানগুলি স্ক্রোলভিউডিডসক্রোল বার্তায় ব্যবহারকারীদের উদ্দেশ্যে স্ক্রোলের নির্দেশ নির্ধারণ করতে ব্যবহার করি ।

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

   if (scrollDirection==0){//we need to determine direction
       //use the difference between positions to determine the direction.
       if (abs(startPos.x-scrollView.contentOffset.x)<abs(startPos.y-scrollView.contentOffset.y)){          
          NSLog(@"Vertical Scrolling");
          scrollDirection=1;
       } else {
          NSLog(@"Horitonzal Scrolling");
          scrollDirection=2;
       }
    }
//Update scroll position of the scrollview according to detected direction.     
    if (scrollDirection==1) {
       [scrollView setContentOffset:CGPointMake(startPos.x,scrollView.contentOffset.y) animated:NO];
    } else if (scrollDirection==2){
       [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x,startPos.y) animated:NO];
    }
 }

অবশেষে ব্যবহারকারীদের টেনে আনার সময় আমাদের সকল আপডেট অপারেশন বন্ধ করতে হবে;

 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    if (decelerate) {
       scrollDirection=3;
    }
 }

হুম ... প্রকৃতপক্ষে, আরও তদন্তের পরে - এটি বেশ ভাল কাজ করে তবে সমস্যাটি হ'ল হ্রাস পর্বের সময় এটি দিকের নিয়ন্ত্রণ হারিয়ে ফেলে - তাই যদি আপনি নিজের আঙুলটি তির্যকভাবে সরানো শুরু করেন তবে এটি কেবল অনুভূমিকভাবে বা উল্লম্বভাবে চলতে দেখা যাবে আপনি যতক্ষণ না যেতে দিন এটি কিছুক্ষণের জন্য তির্যক দিকটিতে হ্রাস পাবে
andygeers

@andygeers, এটা ভাল কাজ করতে পারে যদি - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ if (decelerate) { scrollDirection=3; } }এ পরিবর্তিত হয়েছে - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ if (!decelerate) { scrollDirection=0; } }এবং- (void)scrollViewDidEndDecelerating{ scrollDirection=0; }
cduck

আমার পক্ষে কাজ করেনি। ফ্লাইটে কনটেন্টঅফসেট সেট করা পেজিং আচরণ নষ্ট করে বলে মনে হচ্ছে। আমি ম্যাটিয়াস ওডম্যানের সমাধান নিয়ে গেলাম went
অর্টউইন জেন্টজ

13

আমি এখানে গ্রাভিডিজিং করতে পারি, তবে একই সমস্যাটি সমাধান করার চেষ্টা করতে গিয়ে আমি আজ এই পোস্টটিতে হোঁচট খেয়েছি। এখানে আমার সমাধানটি দুর্দান্ত কাজ করছে বলে মনে হচ্ছে।

আমি স্ক্রিনফুল কন্টেন্ট প্রদর্শন করতে চাই, তবে ব্যবহারকারীকে বাম এবং ডানদিকে উপরে 4 টির মধ্যে স্ক্রোলফুলের মধ্যে একটিতে স্ক্রোল করার অনুমতি দিন। আমার 320x480 আকারের একক ইউআইএসক্রোলভিউ এবং 960x1440 এর একটি কন্টেন্টসাইজ রয়েছে। সামগ্রীটি অফসেট 320,480 এ শুরু হয়। স্ক্রোলভিউডিডএন্ড ত্বরণকারী: এ, আমি 5 টি ভিউ (কেন্দ্রের ভিউ এবং এর চারপাশের 4) পুনরায় আঁকছি এবং সামগ্রীটি অফসেটটিকে 320,480 এ পুনরায় সেট করেছি।

এখানে আমার দ্রবণটির মাংস, স্ক্রোলভিউডিডসক্রোল: পদ্ধতি।

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{   
    if (!scrollingVertically && ! scrollingHorizontally)
    {
        int xDiff = abs(scrollView.contentOffset.x - 320);
        int yDiff = abs(scrollView.contentOffset.y - 480);

        if (xDiff > yDiff)
        {
            scrollingHorizontally = YES;
        }
        else if (xDiff < yDiff)
        {
            scrollingVertically = YES;
        }
    }

    if (scrollingHorizontally)
    {
        scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, 480);
    }
    else if (scrollingVertically)
    {
        scrollView.contentOffset = CGPointMake(320, scrollView.contentOffset.y);
    }
}

আপনি সম্ভবত দেখতে পাবেন যে ব্যবহারকারী যখন স্ক্রোল ভিউটি যেতে দেয় তখন এই কোডটি ভালভাবে "বিভ্রান্ত" করে না - এটি মারা যাবে। আপনি যদি হ্রাস না চান তবে এটি আপনার পক্ষে ভাল।
andygeers

4

বলছি এটিকে সাবউভিউয়ের উচ্চতাটিকে স্ক্রোল দেখার উচ্চতা এবং সামগ্রী আকারের উচ্চতার সমান করার মতোই সহজ। তারপরে উল্লম্ব স্ক্রোলিং অক্ষম করা আছে।


4
অন্য কারও পক্ষে এই প্রশ্নে হোঁচট খাচ্ছে: আমি মনে করি এই উত্তরটি সম্পাদনা করার আগে পোস্ট করা হয়েছিল যা প্রশ্নটি পরিষ্কার করে দিয়েছে। এটি আপনাকে কেবল অনুভূমিকভাবে স্ক্রোল করার অনুমতি দেবে, এটি উল্লম্ব বা অনুভূমিকভাবে স্ক্রোল করতে সক্ষম হওয়ার বিষয়টি বিবেচনা করে না তবে তির্যক নয়।
andygeers

3

এখানে আমার একটি পৃষ্ঠাগুলির বাস্তবায়ন UIScrollViewযা কেবল orthogonal স্ক্রোলকে মঞ্জুরি দেয়। সেট pagingEnabledকরতে ভুলবেন না YES

পেজডোর আর্থোস্ক্রোলভিউ

@interface PagedOrthoScrollView : UIScrollView
@end

পেজডোর আর্থোস্ক্রোলভিউ.এম

#import "PagedOrthoScrollView.h"

typedef enum {
  PagedOrthoScrollViewLockDirectionNone,
  PagedOrthoScrollViewLockDirectionVertical,
  PagedOrthoScrollViewLockDirectionHorizontal
} PagedOrthoScrollViewLockDirection; 

@interface PagedOrthoScrollView ()
@property(nonatomic, assign) PagedOrthoScrollViewLockDirection dirLock;
@property(nonatomic, assign) CGFloat valueLock;
@end

@implementation PagedOrthoScrollView
@synthesize dirLock;
@synthesize valueLock;

- (id)initWithFrame:(CGRect)frame {
  self = [super initWithFrame:frame];
  if (self == nil) {
    return self;
  }

  self.dirLock = PagedOrthoScrollViewLockDirectionNone;
  self.valueLock = 0;

  return self;
}

- (void)setBounds:(CGRect)bounds {
  int mx, my;

  if (self.dirLock == PagedOrthoScrollViewLockDirectionNone) {
    // is on even page coordinates, set dir lock and lock value to closest page 
    mx = abs((int)CGRectGetMinX(bounds) % (int)CGRectGetWidth(self.bounds));
    if (mx != 0) {
      self.dirLock = PagedOrthoScrollViewLockDirectionHorizontal;
      self.valueLock = (round(CGRectGetMinY(bounds) / CGRectGetHeight(self.bounds)) *
                        CGRectGetHeight(self.bounds));
    } else {
      self.dirLock = PagedOrthoScrollViewLockDirectionVertical;
      self.valueLock = (round(CGRectGetMinX(bounds) / CGRectGetWidth(self.bounds)) *
                        CGRectGetWidth(self.bounds));
    }

    // show only possible scroll indicator
    self.showsVerticalScrollIndicator = dirLock == PagedOrthoScrollViewLockDirectionVertical;
    self.showsHorizontalScrollIndicator = dirLock == PagedOrthoScrollViewLockDirectionHorizontal;
  }

  if (self.dirLock == PagedOrthoScrollViewLockDirectionHorizontal) {
    bounds.origin.y = self.valueLock;
  } else {
    bounds.origin.x = self.valueLock;
  }

  mx = abs((int)CGRectGetMinX(bounds) % (int)CGRectGetWidth(self.bounds));
  my = abs((int)CGRectGetMinY(bounds) % (int)CGRectGetHeight(self.bounds));

  if (mx == 0 && my == 0) {
    // is on even page coordinates, reset lock
    self.dirLock = PagedOrthoScrollViewLockDirectionNone;
  }

  [super setBounds:bounds];
}

@end

4
আইওএস-এও দুর্দান্ত কাজ করে Thanks. ধন্যবাদ!
অর্টউইন জেন্টজ

3

আমাকেও এই সমস্যাটি সমাধান করতে হয়েছিল, এবং আন্দ্রে ট্যারানসভের উত্তরে অবশ্যই UIScrollViewsকাজটি বোঝার জন্য প্রচুর দরকারী তথ্য রয়েছে , আমি অনুভব করি যে সমাধানটি কিছুটা জটিল। আমার সমাধান, যা কোনও সাবক্লাসিং বা স্পর্শ ফরওয়ার্ডিংয়ের সাথে জড়িত নয়, তা নিম্নরূপ:

  1. দুটি নেস্টেড স্ক্রোল ভিউ তৈরি করুন, প্রতিটি দিকের জন্য একটি।
  2. দুটি ডামি তৈরি করুন UIPanGestureRecognizers, প্রতিটি দিকের জন্য আবার একটি।
  3. UIScrollViews'PanGestureRecognizer বৈশিষ্ট্য এবং নির্বাচনী UIPanGestureRecognizerব্যবহার করে আপনার UIScrolView এর কাঙ্ক্ষিত স্ক্রোলিং দিকের লম্ব দিকের সাথে সামঞ্জস্যপূর্ণ ডামির মধ্যে ব্যর্থতা নির্ভরতা তৈরি করুন UIGestureRecognizer's -requireGestureRecognizerToFail:
  4. ইন -gestureRecognizerShouldBegin:আপনার ডামি UIPanGestureRecognizers জন্য callbacks প্যান অঙ্গভঙ্গি এর -translationInView ব্যবহারের প্রাথমিক দিক নিরূপণ: নির্বাচক (আপনার UIPanGestureRecognizersনা হওয়া পর্যন্ত আপনার স্পর্শ একটি প্যান হিসাবে নিবন্ধিত করার জন্য যথেষ্ট অনুবাদ করেছে এই প্রতিনিধি কলব্যাক কল না হবে)। গণনা করা দিকের উপর নির্ভর করে আপনার অঙ্গভঙ্গি শনাক্তকারীকে অনুমতি দিন বা অনুমতি দিন, যার ফলে লম্বালম্বি ইউআইএসক্রোলভিউ প্যান অঙ্গভঙ্গি শনাক্তকারীকে আরম্ভ করার অনুমতি দেওয়া হবে কিনা তা নিয়ন্ত্রণ করা উচিত।
  5. ইন -gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:, আপনার ডামিকে UIPanGestureRecognizersস্ক্রোলিংয়ের পাশাপাশি চালানোর অনুমতি দেবেন না (যদি আপনি কিছু অতিরিক্ত আচরণ যুক্ত করতে চান তবে)।

2

আমি যা করেছি তা হল ভিউ স্ক্রিনের আকারের ফ্রেম সহ একটি পেজিং ইউআইএসক্রোলভিউ তৈরি করা এবং আমার সমস্ত সামগ্রীর জন্য প্রয়োজনীয় প্রস্থ এবং 1 এর উচ্চতা (ধন্যবাদ টোনটেল) এর সামগ্রীর আকার সেট করা। তারপরে আমি প্রতিটি পৃষ্ঠায় সেট করা ফ্রেম, ভিউ স্ক্রিনের আকার এবং মেনু ইউআইএসক্রোলভিউ পৃষ্ঠাগুলি তৈরি করেছি এবং প্রতিটিটির সামগ্রীর আকারকে পর্দার প্রস্থে এবং প্রতিটিটির জন্য প্রয়োজনীয় উচ্চতাতে সেট করেছি। তারপরে আমি কেবল মেনু পৃষ্ঠাগুলির প্রত্যেককে পেজিং ভিউতে যুক্ত করেছিলাম। পেজিং স্ক্রোল ভিউতে সক্ষম হয়েছে তা নিশ্চিত করুন তবে মেনু ভিউগুলিতে অক্ষম করা হয়েছে (ডিফল্টরূপে অক্ষম করা উচিত) এবং আপনার যেতে ভাল হওয়া উচিত।

পেজিং স্ক্রোল ভিউটি এখন অনুভূমিকভাবে স্ক্রল করে তবে সামগ্রীর উচ্চতার কারণে উল্লম্বভাবে নয়। প্রতিটি পৃষ্ঠা উল্লম্বভাবে স্ক্রল করে তবে অনুভূমিকভাবে নয় কারণ এর সামগ্রীর আকারের বাধাও।

কোডটি যদি এখানে ব্যাখ্যাটি পছন্দসই হতে থাকে তবে:

UIScrollView *newPagingScrollView =  [[UIScrollView alloc] initWithFrame:self.view.bounds]; 
[newPagingScrollView setPagingEnabled:YES];
[newPagingScrollView setShowsVerticalScrollIndicator:NO];
[newPagingScrollView setShowsHorizontalScrollIndicator:NO];
[newPagingScrollView setDelegate:self];
[newPagingScrollView setContentSize:CGSizeMake(self.view.bounds.size.width * NumberOfDetailPages, 1)];
[self.view addSubview:newPagingScrollView];

float pageX = 0;

for (int i = 0; i < NumberOfDetailPages; i++)
{               
    CGRect pageFrame = (CGRect) 
    {
        .origin = CGPointMake(pageX, pagingScrollView.bounds.origin.y), 
        .size = pagingScrollView.bounds.size
    };
    UIScrollView *newPage = [self createNewPageFromIndex:i ToPageFrame:pageFrame]; // newPage.contentSize custom set in here        
    [pagingScrollView addSubview:newPage];

    pageX += pageFrame.size.width;  
}           

2

ধন্যবাদ টোনটেল আমি আপনার পদ্ধতির সামান্য পরিবর্তন করেছি, তবে অনুভূমিক স্ক্রোলিং প্রতিরোধ করার জন্য আমার ঠিক এটির প্রয়োজন ছিল।

self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width, 1);

2

এটি আইকম্পটটির উন্নত সমাধান, যা আমার পক্ষে বেশ অস্থির ছিল। এই এক ভাল কাজ করে এবং এটি কার্যকর করা সহজ:

- (void) scrollViewWillBeginDragging: (UIScrollView *) scrollView
{
    self.oldContentOffset = scrollView.contentOffset;
}

- (void) scrollViewDidScroll: (UIScrollView *) scrollView
{    

    float XOffset = fabsf(self.oldContentOffset.x - scrollView.contentOffset.x );
    float YOffset = fabsf(self.oldContentOffset.y - scrollView.contentOffset.y );

        if (scrollView.contentOffset.x != self.oldContentOffset.x && (XOffset >= YOffset) )
        {

            scrollView.pagingEnabled = YES;
            scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x,
                                                   self.oldContentOffset.y);

        }
        else
        {
            scrollView.pagingEnabled = NO;
               scrollView.contentOffset = CGPointMake( self.oldContentOffset.x,
                                                   scrollView.contentOffset.y);
        }

}


- (void) scrollViewDidEndDecelerating: (UIScrollView *) scrollView
{
    self.oldContentOffset = scrollView.contentOffset;
}

2

ভবিষ্যতের রেফারেন্সের জন্য, আমি আন্দ্রে তানাসভের উত্তরের উপর ভিত্তি করে তৈরি করেছি এবং নিম্নলিখিত সমাধানটি নিয়ে এসেছি যা ভাল কাজ করে।

কন্টেন্টঅফসেট সংরক্ষণ করার জন্য প্রথমে একটি ভেরিয়েবল সংজ্ঞায়িত করুন এবং এটি 0,0 স্থানাঙ্কে সেট করুন

var positionScroll = CGPointMake(0, 0)

এখন স্ক্রোলভিউ প্রতিনিধিতে নিম্নলিখিতটি প্রয়োগ করুন:

override func scrollViewWillBeginDragging(scrollView: UIScrollView) {
    // Note that we are getting a reference to self.scrollView and not the scrollView referenced passed by the method
    // For some reason, not doing this fails to get the logic to work
    self.positionScroll = (self.scrollView?.contentOffset)!
}

override func scrollViewDidScroll(scrollView: UIScrollView) {

    // Check that contentOffset is not nil
    // We do this because the scrollViewDidScroll method is called on viewDidLoad
    if self.scrollView?.contentOffset != nil {

        // The user wants to scroll on the X axis
        if self.scrollView?.contentOffset.x > self.positionScroll.x || self.scrollView?.contentOffset.x < self.positionScroll.x {

            // Reset the Y position of the scrollView to what it was BEFORE scrolling started
            self.scrollView?.contentOffset = CGPointMake((self.scrollView?.contentOffset.x)!, self.positionScroll.y);
            self.scrollView?.pagingEnabled = true
        }

        // The user wants to scroll on the Y axis
        else {
            // Reset the X position of the scrollView to what it was BEFORE scrolling started
            self.scrollView?.contentOffset = CGPointMake(self.positionScroll.x, (self.scrollView?.contentOffset.y)!);
            self.collectionView?.pagingEnabled = false
        }

    }

}

আশাকরি এটা সাহায্য করবে.


1

ডক্স থেকে:

"ডিফল্ট মান হ'ল না, যার অর্থ হ'ল অনুভূমিক এবং উল্লম্ব দিক উভয় ক্ষেত্রেই স্ক্রোলিংয়ের অনুমতি রয়েছে। "

আমি মনে করি গুরুত্বপূর্ণ অংশটি "যদি ... ব্যবহারকারী এক সাধারণ দিকের দিকে টানতে শুরু করে "। সুতরাং যদি তারা তির্যকভাবে টানতে শুরু করে তবে এটি কিক করে না interpretation এমন নয় যে এটি ব্যাখ্যা করার সময় এই ডক্সটি সর্বদা নির্ভরযোগ্য - তবে আপনি যা দেখছেন তার সাথে এটি মানানসই নয়।

এটি আসলে বোধগম্য মনে হয়। আমাকে জিজ্ঞাসা করতে হবে - আপনি যে কোনও সময় কেবল অনুভূমিক বা কেবল উল্লম্ব ক্ষেত্রেই সীমাবদ্ধ রাখতে চান? সম্ভবত ইউআইএসক্রলভিউ আপনার জন্য সরঞ্জাম নয়?


1

আমার দর্শনটিতে 10 টি অনুভূমিক দর্শন রয়েছে এবং সেগুলির মধ্যে কয়েকটিতে একাধিক উল্লম্ব দর্শন রয়েছে, সুতরাং আপনি এর মতো কিছু পাবেন:


1.0   2.0   3.1    4.1
      2.1   3.1
      2.2
      2.3

অনুভূমিক এবং উল্লম্ব অক্ষ উভয় পৃষ্ঠাসমূহ সক্ষম

ভিউতে নিম্নলিখিত বৈশিষ্ট্যগুলিও রয়েছে:

[self setDelaysContentTouches:NO];
[self setMultipleTouchEnabled:NO];
[self setDirectionalLockEnabled:YES];

তির্যক স্ক্রোলিং রোধ করতে এখন এটি করুন:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    int pageWidth = 768;
    int pageHeight = 1024;
    int subPage =round(self.contentOffset.y / pageHeight);
    if ((int)self.contentOffset.x % pageWidth != 0 && (int)self.contentOffset.y % pageHeight != 0) {
        [self setContentOffset:CGPointMake(self.contentOffset.x, subPage * pageHeight];
    } 
}

আমার জন্য মন্ত্রীর মতো কাজ করে!


4
বুঝতে পারছেন না এটি কীভাবে আপনার জন্য কাজ করে ... আপনি কি কোনও নমুনা-প্রকল্প আপলোড করতে পারেন?
hfossli



0

যদি আপনি 3.0 বিটাতে এটি চেষ্টা না করে থাকেন, তবে আমি আপনাকে এটির একটি শট দেওয়ার পরামর্শ দিই। আমি বর্তমানে একটি স্ক্রোল ভিউয়ের ভিতরে টেবিল দর্শনের একটি সিরিজ ব্যবহার করছি এবং এটি প্রত্যাশার মতোই কাজ করে। (ভাল, স্ক্রোলিং যাইহোক, যাইহোক। সম্পূর্ণ আলাদা ইস্যুটির সমাধানের জন্য এই প্রশ্নটি খুঁজে পেয়েছিল ...)


0

@ অ্যান্ড্রেইন্টান্সভের দ্বিতীয় সমাধানটিতে সুইফ্ট খুঁজছেন তাদের পক্ষে কোডের মতো এটির মতো:

    var positionScroll:CGFloat = 0

    func scrollViewWillBeginDragging(scrollView: UIScrollView) {
        positionScroll = self.theScroll.contentOffset.x
    }

    func scrollViewDidScroll(scrollView: UIScrollView) {
        if self.theScroll.contentOffset.x > self.positionScroll || self.theScroll.contentOffset.x < self.positionScroll{
             self.theScroll.pagingEnabled = true
        }else{
            self.theScroll.pagingEnabled = false
        }
    }

আমরা এখানে যা করছি তা হ'ল স্ক্রোলভিউটি টেনে আনার আগে বর্তমান অবস্থানটি রাখা এবং তারপরে এক্স এর বর্তমান অবস্থানের তুলনায় এক্স বৃদ্ধি পেয়েছে বা হ্রাস পেয়েছে কিনা তা পরীক্ষা করে দেখুন। যদি হ্যাঁ হয়, তবে পৃষ্ঠাটি সক্ষম করুনটিকে সত্য হিসাবে সেট করুন, যদি না (y বৃদ্ধি পেয়েছে / হ্রাস পেয়েছে) তবে প্যাকেজিংয়ে সেট করুন কার্যকর এ ভুলে সক্ষম

আশা করি এটি নতুন আগতদের পক্ষে কার্যকর!


0

আমি স্ক্রোলভিউডিডিবেগিনড্র্যাগিং (_ :) বাস্তবায়ন করে এবং অন্তর্নিহিত ইউআইপিএনজেস্টারআর সনাক্তকারীটির গতিবেগ দেখে এটি সমাধান করতে পেরেছি।

নোট: এই সমাধানের সাহায্যে, প্রতিটি প্যানটি যে তির্যক হত তা স্ক্রোলভিউ দ্বারা উপেক্ষা করা হবে।

override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    super.scrollViewWillBeginDragging(scrollView)
    let velocity = scrollView.panGestureRecognizer.velocity(in: scrollView)
    if velocity.x != 0 && velocity.y != 0 {
        scrollView.panGestureRecognizer.isEnabled = false
        scrollView.panGestureRecognizer.isEnabled = true
    }
}

-3

আপনি যদি নিজের ইন্টারফেসটি ডিজাইন করতে ইন্টারফেস বিল্ডার ব্যবহার করে থাকেন - এটি বেশ সহজেই করা যেতে পারে।

ইন্টারফেস বিল্ডারে কেবল ইউআইএসক্রোলভিউতে ক্লিক করুন এবং বিকল্পটি (পরিদর্শকের মধ্যে) নির্বাচন করুন যা এটি কেবলমাত্র একটি উপায় স্ক্রোলিংয়ের মধ্যে সীমাবদ্ধ করে।


4
এটি করার জন্য আইবিতে কোনও বিকল্প নেই। দুটি অপশন যা আপনি উল্লেখ করতে পারেন সেই স্ক্রোল বারটি প্রদর্শন করতে হবে, আসল স্ক্রোলিংয়ের সাথে নয়। তদুপরি, স্ক্রোলিং শুরু হয়ে গেলে কেবল দিকনির্দেশ লকটি দিকটি লক করে।
সফটওয়্যার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.